Skip to content

Commit 0e382fa

Browse files
committed
Merge tag 'for-linus-2023062701' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid
Pull HID updates from Jiri Kosina: - more bullet-proof handling of devres-managed resources in HID core (Dmitry Torokhov) - conversion of hid-wacom to use ktime_t (Jason Gerecke) - touch selftests for hid-wacom (Joshua Dickens) - support for nVidia Thunderstrike (SHIELD 2017) controller (Rahul Rameshbabu) - power management reset-during-suspend fix for goodix Chromebook devices (Fei Shao) - assorted device ID additions, device-specific quirks and code cleanups * tag 'for-linus-2023062701' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid: (27 commits) HID: wacom: Use ktime_t rather than int when dealing with timestamps HID: hidraw: fix data race on device refcount HID: intel-ish-hid: ipc: Add Arrow Lake PCI device ID HID: logitech-hidpp: add HIDPP_QUIRK_DELAYED_INIT for the T651. HID: add quirk for 03f0:464a HP Elite Presenter Mouse HID: nvidia-shield: Support LED functionality for Thunderstrike HID: nvidia-shield: Add mappings for consumer HID USAGE buttons HID: nvidia-shield: Initial driver implementation with Thunderstrike support HID: apple: Option to swap only left side mod keys HID: uclogic: Modular KUnit tests should not depend on KUNIT=y HID: fix an error code in hid_check_device_match() HID: logitech-hidpp: Add USB and Bluetooth IDs for the Logitech G915 TKL Keyboard HID: i2c-hid: Switch i2c drivers back to use .probe() HID: i2c-hid: goodix: Add support for "goodix,no-reset-during-suspend" property dt-bindings: input: goodix: Add "goodix,no-reset-during-suspend" property HID: microsoft: Add rumble support to latest xbox controllers selftests: hid: Add touch tests for Wacom devices HID: ensure timely release of driver-allocated resources HID: split apart hid_device_probe to make logic more apparent HID: amd_sfh: Split sensor and HID initialization for SFH1.1 ...
2 parents 675285a + b571809 commit 0e382fa

File tree

25 files changed

+1035
-144
lines changed

25 files changed

+1035
-144
lines changed

Documentation/devicetree/bindings/input/goodix,gt7375p.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,15 @@ properties:
4343
itself as long as it allows the main board to make signals compatible
4444
with what the touchscreen is expecting for its IO rails.
4545

46+
goodix,no-reset-during-suspend:
47+
description:
48+
Set this to true to enforce the driver to not assert the reset GPIO
49+
during suspend.
50+
Due to potential touchscreen hardware flaw, back-powering could happen in
51+
suspend if the power supply is on and with active-low reset GPIO asserted.
52+
This property is used to avoid the back-powering issue.
53+
type: boolean
54+
4655
required:
4756
- compatible
4857
- reg

MAINTAINERS

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9200,6 +9200,12 @@ L: [email protected]
92009200
S: Maintained
92019201
F: drivers/hid/hid-pxrc.c
92029202

9203+
HID NVIDIA SHIELD DRIVER
9204+
M: Rahul Rameshbabu <[email protected]>
9205+
9206+
S: Maintained
9207+
F: drivers/hid/hid-nvidia-shield.c
9208+
92039209
HID PLAYSTATION DRIVER
92049210
M: Roderick Colenbrander <[email protected]>
92059211

drivers/hid/Kconfig

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,24 @@ config HID_NTRIG
788788
help
789789
Support for N-Trig touch screen.
790790

791+
config HID_NVIDIA_SHIELD
792+
tristate "NVIDIA SHIELD devices"
793+
depends on USB_HID
794+
depends on BT_HIDP
795+
help
796+
Support for NVIDIA SHIELD accessories.
797+
798+
Supported devices:
799+
- Thunderstrike (NVIDIA SHIELD Controller 2017)
800+
801+
config NVIDIA_SHIELD_FF
802+
bool "NVIDIA SHIELD force feedback support"
803+
depends on HID_NVIDIA_SHIELD
804+
select INPUT_FF_MEMLESS
805+
help
806+
Say Y here if you would like to enable force feedback support for
807+
NVIDIA SHIELD accessories with haptics capabilities.
808+
791809
config HID_ORTEK
792810
tristate "Ortek PKB-1700/WKB-2000/Skycable wireless keyboard and mouse trackpad"
793811
help
@@ -1285,7 +1303,7 @@ config HID_MCP2221
12851303

12861304
config HID_KUNIT_TEST
12871305
tristate "KUnit tests for HID" if !KUNIT_ALL_TESTS
1288-
depends on KUNIT=y
1306+
depends on KUNIT
12891307
depends on HID_BATTERY_STRENGTH
12901308
depends on HID_UCLOGIC
12911309
default KUNIT_ALL_TESTS

drivers/hid/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ obj-$(CONFIG_HID_MULTITOUCH) += hid-multitouch.o
8787
obj-$(CONFIG_HID_NINTENDO) += hid-nintendo.o
8888
obj-$(CONFIG_HID_NTI) += hid-nti.o
8989
obj-$(CONFIG_HID_NTRIG) += hid-ntrig.o
90+
obj-$(CONFIG_HID_NVIDIA_SHIELD) += hid-nvidia-shield.o
9091
obj-$(CONFIG_HID_ORTEK) += hid-ortek.o
9192
obj-$(CONFIG_HID_PRODIKEYS) += hid-prodikeys.o
9293
obj-$(CONFIG_HID_PANTHERLORD) += hid-pl.o

drivers/hid/amd-sfh-hid/amd_sfh_client.c

Lines changed: 14 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
215215
struct device *dev;
216216
u32 feature_report_size;
217217
u32 input_report_size;
218-
int rc, i, status;
218+
int rc, i;
219219
u8 cl_idx;
220220

221221
req_list = &cl_data->req_list;
@@ -286,56 +286,37 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
286286
if (rc)
287287
goto cleanup;
288288
mp2_ops->start(privdata, info);
289-
status = amd_sfh_wait_for_response
290-
(privdata, cl_data->sensor_idx[i], SENSOR_ENABLED);
291-
if (status == SENSOR_ENABLED) {
289+
cl_data->sensor_sts[i] = amd_sfh_wait_for_response
290+
(privdata, cl_data->sensor_idx[i], SENSOR_ENABLED);
291+
}
292+
293+
for (i = 0; i < cl_data->num_hid_devices; i++) {
294+
cl_data->cur_hid_dev = i;
295+
if (cl_data->sensor_sts[i] == SENSOR_ENABLED) {
292296
cl_data->is_any_sensor_enabled = true;
293-
cl_data->sensor_sts[i] = SENSOR_ENABLED;
294-
rc = amdtp_hid_probe(cl_data->cur_hid_dev, cl_data);
295-
if (rc) {
296-
mp2_ops->stop(privdata, cl_data->sensor_idx[i]);
297-
status = amd_sfh_wait_for_response
298-
(privdata, cl_data->sensor_idx[i], SENSOR_DISABLED);
299-
if (status != SENSOR_ENABLED)
300-
cl_data->sensor_sts[i] = SENSOR_DISABLED;
301-
dev_dbg(dev, "sid 0x%x (%s) status 0x%x\n",
302-
cl_data->sensor_idx[i],
303-
get_sensor_name(cl_data->sensor_idx[i]),
304-
cl_data->sensor_sts[i]);
297+
rc = amdtp_hid_probe(i, cl_data);
298+
if (rc)
305299
goto cleanup;
306-
}
307300
} else {
308301
cl_data->sensor_sts[i] = SENSOR_DISABLED;
309-
dev_dbg(dev, "sid 0x%x (%s) status 0x%x\n",
310-
cl_data->sensor_idx[i],
311-
get_sensor_name(cl_data->sensor_idx[i]),
312-
cl_data->sensor_sts[i]);
313302
}
314303
dev_dbg(dev, "sid 0x%x (%s) status 0x%x\n",
315304
cl_data->sensor_idx[i], get_sensor_name(cl_data->sensor_idx[i]),
316305
cl_data->sensor_sts[i]);
317306
}
307+
318308
if (!cl_data->is_any_sensor_enabled ||
319309
(mp2_ops->discovery_status && mp2_ops->discovery_status(privdata) == 0)) {
320-
amd_sfh_hid_client_deinit(privdata);
321-
for (i = 0; i < cl_data->num_hid_devices; i++) {
322-
devm_kfree(dev, cl_data->feature_report[i]);
323-
devm_kfree(dev, in_data->input_report[i]);
324-
devm_kfree(dev, cl_data->report_descr[i]);
325-
}
326310
dev_warn(dev, "Failed to discover, sensors not enabled is %d\n", cl_data->is_any_sensor_enabled);
327-
return -EOPNOTSUPP;
311+
rc = -EOPNOTSUPP;
312+
goto cleanup;
328313
}
329314
schedule_delayed_work(&cl_data->work_buffer, msecs_to_jiffies(AMD_SFH_IDLE_LOOP));
330315
return 0;
331316

332317
cleanup:
318+
amd_sfh_hid_client_deinit(privdata);
333319
for (i = 0; i < cl_data->num_hid_devices; i++) {
334-
if (in_data->sensor_virt_addr[i]) {
335-
dma_free_coherent(&privdata->pdev->dev, 8 * sizeof(int),
336-
in_data->sensor_virt_addr[i],
337-
cl_data->sensor_dma_addr[i]);
338-
}
339320
devm_kfree(dev, cl_data->feature_report[i]);
340321
devm_kfree(dev, in_data->input_report[i]);
341322
devm_kfree(dev, cl_data->report_descr[i]);

drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_init.c

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -168,28 +168,16 @@ static int amd_sfh1_1_hid_client_init(struct amd_mp2_dev *privdata)
168168
status = amd_sfh_wait_for_response
169169
(privdata, cl_data->sensor_idx[i], ENABLE_SENSOR);
170170

171-
status = (status == 0) ? SENSOR_ENABLED : SENSOR_DISABLED;
171+
cl_data->sensor_sts[i] = (status == 0) ? SENSOR_ENABLED : SENSOR_DISABLED;
172+
}
172173

173-
if (status == SENSOR_ENABLED) {
174+
for (i = 0; i < cl_data->num_hid_devices; i++) {
175+
cl_data->cur_hid_dev = i;
176+
if (cl_data->sensor_sts[i] == SENSOR_ENABLED) {
174177
cl_data->is_any_sensor_enabled = true;
175-
cl_data->sensor_sts[i] = SENSOR_ENABLED;
176178
rc = amdtp_hid_probe(i, cl_data);
177-
if (rc) {
178-
mp2_ops->stop(privdata, cl_data->sensor_idx[i]);
179-
status = amd_sfh_wait_for_response
180-
(privdata, cl_data->sensor_idx[i], DISABLE_SENSOR);
181-
if (status == 0)
182-
status = SENSOR_DISABLED;
183-
if (status != SENSOR_ENABLED)
184-
cl_data->sensor_sts[i] = SENSOR_DISABLED;
185-
dev_dbg(dev, "sid 0x%x (%s) status 0x%x\n",
186-
cl_data->sensor_idx[i],
187-
get_sensor_name(cl_data->sensor_idx[i]),
188-
cl_data->sensor_sts[i]);
179+
if (rc)
189180
goto cleanup;
190-
}
191-
} else {
192-
cl_data->sensor_sts[i] = SENSOR_DISABLED;
193181
}
194182
dev_dbg(dev, "sid 0x%x (%s) status 0x%x\n",
195183
cl_data->sensor_idx[i], get_sensor_name(cl_data->sensor_idx[i]),

drivers/hid/hid-apple.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ static unsigned int swap_opt_cmd;
5858
module_param(swap_opt_cmd, uint, 0644);
5959
MODULE_PARM_DESC(swap_opt_cmd, "Swap the Option (\"Alt\") and Command (\"Flag\") keys. "
6060
"(For people who want to keep Windows PC keyboard muscle memory. "
61-
"[0] = as-is, Mac layout. 1 = swapped, Windows layout.)");
61+
"[0] = as-is, Mac layout. 1 = swapped, Windows layout., 2 = swapped, Swap only left side)");
6262

6363
static unsigned int swap_ctrl_cmd;
6464
module_param(swap_ctrl_cmd, uint, 0644);
@@ -319,6 +319,12 @@ static const struct apple_key_translation swapped_option_cmd_keys[] = {
319319
{ }
320320
};
321321

322+
static const struct apple_key_translation swapped_option_cmd_left_keys[] = {
323+
{ KEY_LEFTALT, KEY_LEFTMETA },
324+
{ KEY_LEFTMETA, KEY_LEFTALT },
325+
{ }
326+
};
327+
322328
static const struct apple_key_translation swapped_ctrl_cmd_keys[] = {
323329
{ KEY_LEFTCTRL, KEY_LEFTMETA },
324330
{ KEY_LEFTMETA, KEY_LEFTCTRL },
@@ -416,7 +422,10 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
416422
}
417423

418424
if (swap_opt_cmd) {
419-
trans = apple_find_translation(swapped_option_cmd_keys, code);
425+
if (swap_opt_cmd == 2)
426+
trans = apple_find_translation(swapped_option_cmd_left_keys, code);
427+
else
428+
trans = apple_find_translation(swapped_option_cmd_keys, code);
420429

421430
if (trans)
422431
code = trans->to;

drivers/hid/hid-asus.c

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -884,33 +884,20 @@ static int asus_input_mapping(struct hid_device *hdev,
884884
case 0xb5: asus_map_key_clear(KEY_CALC); break;
885885
case 0xc4: asus_map_key_clear(KEY_KBDILLUMUP); break;
886886
case 0xc5: asus_map_key_clear(KEY_KBDILLUMDOWN); break;
887+
case 0xc7: asus_map_key_clear(KEY_KBDILLUMTOGGLE); break;
887888

888-
/* ASUS touchpad toggle */
889-
case 0x6b: asus_map_key_clear(KEY_F21); break;
889+
case 0x6b: asus_map_key_clear(KEY_F21); break; /* ASUS touchpad toggle */
890+
case 0x38: asus_map_key_clear(KEY_PROG1); break; /* ROG key */
891+
case 0xba: asus_map_key_clear(KEY_PROG2); break; /* Fn+C ASUS Splendid */
892+
case 0x5c: asus_map_key_clear(KEY_PROG3); break; /* Fn+Space Power4Gear */
893+
case 0x99: asus_map_key_clear(KEY_PROG4); break; /* Fn+F5 "fan" symbol */
894+
case 0xae: asus_map_key_clear(KEY_PROG4); break; /* Fn+F5 "fan" symbol */
895+
case 0x92: asus_map_key_clear(KEY_CALC); break; /* Fn+Ret "Calc" symbol */
896+
case 0xb2: asus_map_key_clear(KEY_PROG2); break; /* Fn+Left previous aura */
897+
case 0xb3: asus_map_key_clear(KEY_PROG3); break; /* Fn+Left next aura */
898+
case 0x6a: asus_map_key_clear(KEY_F13); break; /* Screenpad toggle */
899+
case 0x4b: asus_map_key_clear(KEY_F14); break; /* Arrows/Pg-Up/Dn toggle */
890900

891-
/* ROG key */
892-
case 0x38: asus_map_key_clear(KEY_PROG1); break;
893-
894-
/* Fn+C ASUS Splendid */
895-
case 0xba: asus_map_key_clear(KEY_PROG2); break;
896-
897-
/* Fn+Space Power4Gear Hybrid */
898-
case 0x5c: asus_map_key_clear(KEY_PROG3); break;
899-
900-
/* Fn+F5 "fan" symbol on FX503VD */
901-
case 0x99: asus_map_key_clear(KEY_PROG4); break;
902-
903-
/* Fn+F5 "fan" symbol on N-Key keyboard */
904-
case 0xae: asus_map_key_clear(KEY_PROG4); break;
905-
906-
/* Fn+Ret "Calc" symbol on N-Key keyboard */
907-
case 0x92: asus_map_key_clear(KEY_CALC); break;
908-
909-
/* Fn+Left Aura mode previous on N-Key keyboard */
910-
case 0xb2: asus_map_key_clear(KEY_PROG2); break;
911-
912-
/* Fn+Right Aura mode next on N-Key keyboard */
913-
case 0xb3: asus_map_key_clear(KEY_PROG3); break;
914901

915902
default:
916903
/* ASUS lazily declares 256 usages, ignore the rest,
@@ -1268,6 +1255,9 @@ static const struct hid_device_id asus_devices[] = {
12681255
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,
12691256
USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD2),
12701257
QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD },
1258+
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,
1259+
USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD3),
1260+
QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD },
12711261
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,
12721262
USB_DEVICE_ID_ASUSTEK_ROG_CLAYMORE_II_KEYBOARD),
12731263
QUIRK_ROG_CLAYMORE_II_KEYBOARD },
@@ -1310,4 +1300,4 @@ static struct hid_driver asus_driver = {
13101300
};
13111301
module_hid_driver(asus_driver);
13121302

1313-
MODULE_LICENSE("GPL");
1303+
MODULE_LICENSE("GPL");

0 commit comments

Comments
 (0)