diff options
| -rw-r--r-- | drivers/hid/hid-asus.c | 17 | ||||
| -rw-r--r-- | drivers/hid/hid-ids.h | 4 | ||||
| -rw-r--r-- | drivers/hid/hid-sensor-hub.c | 3 | ||||
| -rw-r--r-- | drivers/hid/hid-sony.c | 36 | ||||
| -rw-r--r-- | drivers/hid/usbhid/hid-quirks.c | 2 |
5 files changed, 54 insertions, 8 deletions
diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index d40ed9fdf68d..70b12f89a193 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c | |||
| @@ -64,7 +64,8 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad"); | |||
| 64 | #define QUIRK_SKIP_INPUT_MAPPING BIT(2) | 64 | #define QUIRK_SKIP_INPUT_MAPPING BIT(2) |
| 65 | #define QUIRK_IS_MULTITOUCH BIT(3) | 65 | #define QUIRK_IS_MULTITOUCH BIT(3) |
| 66 | 66 | ||
| 67 | #define NOTEBOOK_QUIRKS QUIRK_FIX_NOTEBOOK_REPORT | 67 | #define KEYBOARD_QUIRKS (QUIRK_FIX_NOTEBOOK_REPORT | \ |
| 68 | QUIRK_NO_INIT_REPORTS) | ||
| 68 | #define TOUCHPAD_QUIRKS (QUIRK_NO_INIT_REPORTS | \ | 69 | #define TOUCHPAD_QUIRKS (QUIRK_NO_INIT_REPORTS | \ |
| 69 | QUIRK_SKIP_INPUT_MAPPING | \ | 70 | QUIRK_SKIP_INPUT_MAPPING | \ |
| 70 | QUIRK_IS_MULTITOUCH) | 71 | QUIRK_IS_MULTITOUCH) |
| @@ -170,11 +171,11 @@ static int asus_raw_event(struct hid_device *hdev, | |||
| 170 | 171 | ||
| 171 | static int asus_input_configured(struct hid_device *hdev, struct hid_input *hi) | 172 | static int asus_input_configured(struct hid_device *hdev, struct hid_input *hi) |
| 172 | { | 173 | { |
| 174 | struct input_dev *input = hi->input; | ||
| 173 | struct asus_drvdata *drvdata = hid_get_drvdata(hdev); | 175 | struct asus_drvdata *drvdata = hid_get_drvdata(hdev); |
| 174 | 176 | ||
| 175 | if (drvdata->quirks & QUIRK_IS_MULTITOUCH) { | 177 | if (drvdata->quirks & QUIRK_IS_MULTITOUCH) { |
| 176 | int ret; | 178 | int ret; |
| 177 | struct input_dev *input = hi->input; | ||
| 178 | 179 | ||
| 179 | input_set_abs_params(input, ABS_MT_POSITION_X, 0, MAX_X, 0, 0); | 180 | input_set_abs_params(input, ABS_MT_POSITION_X, 0, MAX_X, 0, 0); |
| 180 | input_set_abs_params(input, ABS_MT_POSITION_Y, 0, MAX_Y, 0, 0); | 181 | input_set_abs_params(input, ABS_MT_POSITION_Y, 0, MAX_Y, 0, 0); |
| @@ -191,10 +192,10 @@ static int asus_input_configured(struct hid_device *hdev, struct hid_input *hi) | |||
| 191 | hid_err(hdev, "Asus input mt init slots failed: %d\n", ret); | 192 | hid_err(hdev, "Asus input mt init slots failed: %d\n", ret); |
| 192 | return ret; | 193 | return ret; |
| 193 | } | 194 | } |
| 194 | |||
| 195 | drvdata->input = input; | ||
| 196 | } | 195 | } |
| 197 | 196 | ||
| 197 | drvdata->input = input; | ||
| 198 | |||
| 198 | return 0; | 199 | return 0; |
| 199 | } | 200 | } |
| 200 | 201 | ||
| @@ -286,7 +287,11 @@ static int asus_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
| 286 | goto err_stop_hw; | 287 | goto err_stop_hw; |
| 287 | } | 288 | } |
| 288 | 289 | ||
| 289 | drvdata->input->name = "Asus TouchPad"; | 290 | if (drvdata->quirks & QUIRK_IS_MULTITOUCH) { |
| 291 | drvdata->input->name = "Asus TouchPad"; | ||
| 292 | } else { | ||
| 293 | drvdata->input->name = "Asus Keyboard"; | ||
| 294 | } | ||
| 290 | 295 | ||
| 291 | if (drvdata->quirks & QUIRK_IS_MULTITOUCH) { | 296 | if (drvdata->quirks & QUIRK_IS_MULTITOUCH) { |
| 292 | ret = asus_start_multitouch(hdev); | 297 | ret = asus_start_multitouch(hdev); |
| @@ -315,7 +320,7 @@ static __u8 *asus_report_fixup(struct hid_device *hdev, __u8 *rdesc, | |||
| 315 | 320 | ||
| 316 | static const struct hid_device_id asus_devices[] = { | 321 | static const struct hid_device_id asus_devices[] = { |
| 317 | { HID_I2C_DEVICE(USB_VENDOR_ID_ASUSTEK, | 322 | { HID_I2C_DEVICE(USB_VENDOR_ID_ASUSTEK, |
| 318 | USB_DEVICE_ID_ASUSTEK_NOTEBOOK_KEYBOARD), NOTEBOOK_QUIRKS}, | 323 | USB_DEVICE_ID_ASUSTEK_NOTEBOOK_KEYBOARD), KEYBOARD_QUIRKS}, |
| 319 | { HID_I2C_DEVICE(USB_VENDOR_ID_ASUSTEK, | 324 | { HID_I2C_DEVICE(USB_VENDOR_ID_ASUSTEK, |
| 320 | USB_DEVICE_ID_ASUSTEK_TOUCHPAD), TOUCHPAD_QUIRKS }, | 325 | USB_DEVICE_ID_ASUSTEK_TOUCHPAD), TOUCHPAD_QUIRKS }, |
| 321 | { } | 326 | { } |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index ec277b96eaa1..54bd22dc1411 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
| @@ -319,6 +319,7 @@ | |||
| 319 | #define USB_VENDOR_ID_DRAGONRISE 0x0079 | 319 | #define USB_VENDOR_ID_DRAGONRISE 0x0079 |
| 320 | #define USB_DEVICE_ID_DRAGONRISE_WIIU 0x1800 | 320 | #define USB_DEVICE_ID_DRAGONRISE_WIIU 0x1800 |
| 321 | #define USB_DEVICE_ID_DRAGONRISE_PS3 0x1801 | 321 | #define USB_DEVICE_ID_DRAGONRISE_PS3 0x1801 |
| 322 | #define USB_DEVICE_ID_DRAGONRISE_DOLPHINBAR 0x1803 | ||
| 322 | #define USB_DEVICE_ID_DRAGONRISE_GAMECUBE 0x1843 | 323 | #define USB_DEVICE_ID_DRAGONRISE_GAMECUBE 0x1843 |
| 323 | 324 | ||
| 324 | #define USB_VENDOR_ID_DWAV 0x0eef | 325 | #define USB_VENDOR_ID_DWAV 0x0eef |
| @@ -365,6 +366,9 @@ | |||
| 365 | #define USB_VENDOR_ID_FLATFROG 0x25b5 | 366 | #define USB_VENDOR_ID_FLATFROG 0x25b5 |
| 366 | #define USB_DEVICE_ID_MULTITOUCH_3200 0x0002 | 367 | #define USB_DEVICE_ID_MULTITOUCH_3200 0x0002 |
| 367 | 368 | ||
| 369 | #define USB_VENDOR_ID_FUTABA 0x0547 | ||
| 370 | #define USB_DEVICE_ID_LED_DISPLAY 0x7000 | ||
| 371 | |||
| 368 | #define USB_VENDOR_ID_ESSENTIAL_REALITY 0x0d7f | 372 | #define USB_VENDOR_ID_ESSENTIAL_REALITY 0x0d7f |
| 369 | #define USB_DEVICE_ID_ESSENTIAL_REALITY_P5 0x0100 | 373 | #define USB_DEVICE_ID_ESSENTIAL_REALITY_P5 0x0100 |
| 370 | 374 | ||
diff --git a/drivers/hid/hid-sensor-hub.c b/drivers/hid/hid-sensor-hub.c index 5c925228847c..4ef73374a8f9 100644 --- a/drivers/hid/hid-sensor-hub.c +++ b/drivers/hid/hid-sensor-hub.c | |||
| @@ -212,7 +212,6 @@ int sensor_hub_set_feature(struct hid_sensor_hub_device *hsdev, u32 report_id, | |||
| 212 | __s32 value; | 212 | __s32 value; |
| 213 | int ret = 0; | 213 | int ret = 0; |
| 214 | 214 | ||
| 215 | memset(buffer, 0, buffer_size); | ||
| 216 | mutex_lock(&data->mutex); | 215 | mutex_lock(&data->mutex); |
| 217 | report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT); | 216 | report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT); |
| 218 | if (!report || (field_index >= report->maxfield)) { | 217 | if (!report || (field_index >= report->maxfield)) { |
| @@ -256,6 +255,8 @@ int sensor_hub_get_feature(struct hid_sensor_hub_device *hsdev, u32 report_id, | |||
| 256 | int buffer_index = 0; | 255 | int buffer_index = 0; |
| 257 | int i; | 256 | int i; |
| 258 | 257 | ||
| 258 | memset(buffer, 0, buffer_size); | ||
| 259 | |||
| 259 | mutex_lock(&data->mutex); | 260 | mutex_lock(&data->mutex); |
| 260 | report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT); | 261 | report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT); |
| 261 | if (!report || (field_index >= report->maxfield) || | 262 | if (!report || (field_index >= report->maxfield) || |
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index 7687c0875395..f405b07d0381 100644 --- a/drivers/hid/hid-sony.c +++ b/drivers/hid/hid-sony.c | |||
| @@ -1099,8 +1099,11 @@ struct sony_sc { | |||
| 1099 | u8 led_delay_on[MAX_LEDS]; | 1099 | u8 led_delay_on[MAX_LEDS]; |
| 1100 | u8 led_delay_off[MAX_LEDS]; | 1100 | u8 led_delay_off[MAX_LEDS]; |
| 1101 | u8 led_count; | 1101 | u8 led_count; |
| 1102 | bool ds4_dongle_connected; | ||
| 1102 | }; | 1103 | }; |
| 1103 | 1104 | ||
| 1105 | static void sony_set_leds(struct sony_sc *sc); | ||
| 1106 | |||
| 1104 | static inline void sony_schedule_work(struct sony_sc *sc) | 1107 | static inline void sony_schedule_work(struct sony_sc *sc) |
| 1105 | { | 1108 | { |
| 1106 | if (!sc->defer_initialization) | 1109 | if (!sc->defer_initialization) |
| @@ -1430,6 +1433,31 @@ static int sony_raw_event(struct hid_device *hdev, struct hid_report *report, | |||
| 1430 | return -EILSEQ; | 1433 | return -EILSEQ; |
| 1431 | } | 1434 | } |
| 1432 | } | 1435 | } |
| 1436 | |||
| 1437 | /* | ||
| 1438 | * In the case of a DS4 USB dongle, bit[2] of byte 31 indicates | ||
| 1439 | * if a DS4 is actually connected (indicated by '0'). | ||
| 1440 | * For non-dongle, this bit is always 0 (connected). | ||
| 1441 | */ | ||
| 1442 | if (sc->hdev->vendor == USB_VENDOR_ID_SONY && | ||
| 1443 | sc->hdev->product == USB_DEVICE_ID_SONY_PS4_CONTROLLER_DONGLE) { | ||
| 1444 | bool connected = (rd[31] & 0x04) ? false : true; | ||
| 1445 | |||
| 1446 | if (!sc->ds4_dongle_connected && connected) { | ||
| 1447 | hid_info(sc->hdev, "DualShock 4 USB dongle: controller connected\n"); | ||
| 1448 | sony_set_leds(sc); | ||
| 1449 | sc->ds4_dongle_connected = true; | ||
| 1450 | } else if (sc->ds4_dongle_connected && !connected) { | ||
| 1451 | hid_info(sc->hdev, "DualShock 4 USB dongle: controller disconnected\n"); | ||
| 1452 | sc->ds4_dongle_connected = false; | ||
| 1453 | /* Return 0, so hidraw can get the report. */ | ||
| 1454 | return 0; | ||
| 1455 | } else if (!sc->ds4_dongle_connected) { | ||
| 1456 | /* Return 0, so hidraw can get the report. */ | ||
| 1457 | return 0; | ||
| 1458 | } | ||
| 1459 | } | ||
| 1460 | |||
| 1433 | dualshock4_parse_report(sc, rd, size); | 1461 | dualshock4_parse_report(sc, rd, size); |
| 1434 | } | 1462 | } |
| 1435 | 1463 | ||
| @@ -2390,6 +2418,12 @@ static int sony_check_add(struct sony_sc *sc) | |||
| 2390 | } | 2418 | } |
| 2391 | 2419 | ||
| 2392 | memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address)); | 2420 | memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address)); |
| 2421 | |||
| 2422 | snprintf(sc->hdev->uniq, sizeof(sc->hdev->uniq), | ||
| 2423 | "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx", | ||
| 2424 | sc->mac_address[5], sc->mac_address[4], | ||
| 2425 | sc->mac_address[3], sc->mac_address[2], | ||
| 2426 | sc->mac_address[1], sc->mac_address[0]); | ||
| 2393 | } else if ((sc->quirks & SIXAXIS_CONTROLLER_USB) || | 2427 | } else if ((sc->quirks & SIXAXIS_CONTROLLER_USB) || |
| 2394 | (sc->quirks & NAVIGATION_CONTROLLER_USB)) { | 2428 | (sc->quirks & NAVIGATION_CONTROLLER_USB)) { |
| 2395 | buf = kmalloc(SIXAXIS_REPORT_0xF2_SIZE, GFP_KERNEL); | 2429 | buf = kmalloc(SIXAXIS_REPORT_0xF2_SIZE, GFP_KERNEL); |
| @@ -2548,7 +2582,7 @@ static int sony_input_configured(struct hid_device *hdev, | |||
| 2548 | hid_err(sc->hdev, | 2582 | hid_err(sc->hdev, |
| 2549 | "Unable to initialize multi-touch slots: %d\n", | 2583 | "Unable to initialize multi-touch slots: %d\n", |
| 2550 | ret); | 2584 | ret); |
| 2551 | return ret; | 2585 | goto err_stop; |
| 2552 | } | 2586 | } |
| 2553 | 2587 | ||
| 2554 | sony_init_output_report(sc, dualshock4_send_output_report); | 2588 | sony_init_output_report(sc, dualshock4_send_output_report); |
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c index b3e01c82af05..e9d6cc7cdfc5 100644 --- a/drivers/hid/usbhid/hid-quirks.c +++ b/drivers/hid/usbhid/hid-quirks.c | |||
| @@ -83,11 +83,13 @@ static const struct hid_blacklist { | |||
| 83 | { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET }, | 83 | { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET }, |
| 84 | { USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_WIIU, HID_QUIRK_MULTI_INPUT }, | 84 | { USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_WIIU, HID_QUIRK_MULTI_INPUT }, |
| 85 | { USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_PS3, HID_QUIRK_MULTI_INPUT }, | 85 | { USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_PS3, HID_QUIRK_MULTI_INPUT }, |
| 86 | { USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_DOLPHINBAR, HID_QUIRK_MULTI_INPUT }, | ||
| 86 | { USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_GAMECUBE, HID_QUIRK_MULTI_INPUT }, | 87 | { USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_GAMECUBE, HID_QUIRK_MULTI_INPUT }, |
| 87 | { USB_VENDOR_ID_ELAN, HID_ANY_ID, HID_QUIRK_ALWAYS_POLL }, | 88 | { USB_VENDOR_ID_ELAN, HID_ANY_ID, HID_QUIRK_ALWAYS_POLL }, |
| 88 | { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET }, | 89 | { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET }, |
| 89 | { USB_VENDOR_ID_FORMOSA, USB_DEVICE_ID_FORMOSA_IR_RECEIVER, HID_QUIRK_NO_INIT_REPORTS }, | 90 | { USB_VENDOR_ID_FORMOSA, USB_DEVICE_ID_FORMOSA_IR_RECEIVER, HID_QUIRK_NO_INIT_REPORTS }, |
| 90 | { USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28, HID_QUIRK_NOGET }, | 91 | { USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28, HID_QUIRK_NOGET }, |
| 92 | { USB_VENDOR_ID_FUTABA, USB_DEVICE_ID_LED_DISPLAY, HID_QUIRK_NO_INIT_REPORTS }, | ||
| 91 | { USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0A4A, HID_QUIRK_ALWAYS_POLL }, | 93 | { USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0A4A, HID_QUIRK_ALWAYS_POLL }, |
| 92 | { USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0B4A, HID_QUIRK_ALWAYS_POLL }, | 94 | { USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0B4A, HID_QUIRK_ALWAYS_POLL }, |
| 93 | { USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE, HID_QUIRK_ALWAYS_POLL }, | 95 | { USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE, HID_QUIRK_ALWAYS_POLL }, |
