Merge branch 'for-6.5/apple' into for-linus
authorJiri Kosina <jkosina@suse.cz>
Tue, 27 Jun 2023 20:37:24 +0000 (22:37 +0200)
committerJiri Kosina <jkosina@suse.cz>
Tue, 27 Jun 2023 20:37:24 +0000 (22:37 +0200)
- improved support for Keychron K8 keyboard (Lasse Brun)

drivers/hid/amd-sfh-hid/amd_sfh_client.c
drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_init.c
drivers/hid/hid-asus.c
drivers/hid/hid-ids.h
drivers/hid/hid-logitech-hidpp.c
drivers/hid/hid-microsoft.c
drivers/hid/hid-quirks.c
drivers/hid/hidraw.c
drivers/hid/intel-ish-hid/ipc/hw-ish.h
drivers/hid/intel-ish-hid/ipc/pci-ish.c

index d9b7b01..bdb578e 100644 (file)
@@ -215,7 +215,7 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
        struct device *dev;
        u32 feature_report_size;
        u32 input_report_size;
-       int rc, i, status;
+       int rc, i;
        u8 cl_idx;
 
        req_list = &cl_data->req_list;
@@ -286,56 +286,37 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
                if (rc)
                        goto cleanup;
                mp2_ops->start(privdata, info);
-               status = amd_sfh_wait_for_response
-                               (privdata, cl_data->sensor_idx[i], SENSOR_ENABLED);
-               if (status == SENSOR_ENABLED) {
+               cl_data->sensor_sts[i] = amd_sfh_wait_for_response
+                                               (privdata, cl_data->sensor_idx[i], SENSOR_ENABLED);
+       }
+
+       for (i = 0; i < cl_data->num_hid_devices; i++) {
+               cl_data->cur_hid_dev = i;
+               if (cl_data->sensor_sts[i] == SENSOR_ENABLED) {
                        cl_data->is_any_sensor_enabled = true;
-                       cl_data->sensor_sts[i] = SENSOR_ENABLED;
-                       rc = amdtp_hid_probe(cl_data->cur_hid_dev, cl_data);
-                       if (rc) {
-                               mp2_ops->stop(privdata, cl_data->sensor_idx[i]);
-                               status = amd_sfh_wait_for_response
-                                       (privdata, cl_data->sensor_idx[i], SENSOR_DISABLED);
-                               if (status != SENSOR_ENABLED)
-                                       cl_data->sensor_sts[i] = SENSOR_DISABLED;
-                               dev_dbg(dev, "sid 0x%x (%s) status 0x%x\n",
-                                       cl_data->sensor_idx[i],
-                                       get_sensor_name(cl_data->sensor_idx[i]),
-                                       cl_data->sensor_sts[i]);
+                       rc = amdtp_hid_probe(i, cl_data);
+                       if (rc)
                                goto cleanup;
-                       }
                } else {
                        cl_data->sensor_sts[i] = SENSOR_DISABLED;
-                       dev_dbg(dev, "sid 0x%x (%s) status 0x%x\n",
-                               cl_data->sensor_idx[i],
-                               get_sensor_name(cl_data->sensor_idx[i]),
-                               cl_data->sensor_sts[i]);
                }
                dev_dbg(dev, "sid 0x%x (%s) status 0x%x\n",
                        cl_data->sensor_idx[i], get_sensor_name(cl_data->sensor_idx[i]),
                        cl_data->sensor_sts[i]);
        }
+
        if (!cl_data->is_any_sensor_enabled ||
           (mp2_ops->discovery_status && mp2_ops->discovery_status(privdata) == 0)) {
-               amd_sfh_hid_client_deinit(privdata);
-               for (i = 0; i < cl_data->num_hid_devices; i++) {
-                       devm_kfree(dev, cl_data->feature_report[i]);
-                       devm_kfree(dev, in_data->input_report[i]);
-                       devm_kfree(dev, cl_data->report_descr[i]);
-               }
                dev_warn(dev, "Failed to discover, sensors not enabled is %d\n", cl_data->is_any_sensor_enabled);
-               return -EOPNOTSUPP;
+               rc = -EOPNOTSUPP;
+               goto cleanup;
        }
        schedule_delayed_work(&cl_data->work_buffer, msecs_to_jiffies(AMD_SFH_IDLE_LOOP));
        return 0;
 
 cleanup:
+       amd_sfh_hid_client_deinit(privdata);
        for (i = 0; i < cl_data->num_hid_devices; i++) {
-               if (in_data->sensor_virt_addr[i]) {
-                       dma_free_coherent(&privdata->pdev->dev, 8 * sizeof(int),
-                                         in_data->sensor_virt_addr[i],
-                                         cl_data->sensor_dma_addr[i]);
-               }
                devm_kfree(dev, cl_data->feature_report[i]);
                devm_kfree(dev, in_data->input_report[i]);
                devm_kfree(dev, cl_data->report_descr[i]);
index bb8bd78..e9c6413 100644 (file)
@@ -168,28 +168,16 @@ static int amd_sfh1_1_hid_client_init(struct amd_mp2_dev *privdata)
                status = amd_sfh_wait_for_response
                                (privdata, cl_data->sensor_idx[i], ENABLE_SENSOR);
 
-               status = (status == 0) ? SENSOR_ENABLED : SENSOR_DISABLED;
+               cl_data->sensor_sts[i] = (status == 0) ? SENSOR_ENABLED : SENSOR_DISABLED;
+       }
 
-               if (status == SENSOR_ENABLED) {
+       for (i = 0; i < cl_data->num_hid_devices; i++) {
+               cl_data->cur_hid_dev = i;
+               if (cl_data->sensor_sts[i] == SENSOR_ENABLED) {
                        cl_data->is_any_sensor_enabled = true;
-                       cl_data->sensor_sts[i] = SENSOR_ENABLED;
                        rc = amdtp_hid_probe(i, cl_data);
-                       if (rc) {
-                               mp2_ops->stop(privdata, cl_data->sensor_idx[i]);
-                               status = amd_sfh_wait_for_response
-                                       (privdata, cl_data->sensor_idx[i], DISABLE_SENSOR);
-                               if (status == 0)
-                                       status = SENSOR_DISABLED;
-                               if (status != SENSOR_ENABLED)
-                                       cl_data->sensor_sts[i] = SENSOR_DISABLED;
-                               dev_dbg(dev, "sid 0x%x (%s) status 0x%x\n",
-                                       cl_data->sensor_idx[i],
-                                       get_sensor_name(cl_data->sensor_idx[i]),
-                                       cl_data->sensor_sts[i]);
+                       if (rc)
                                goto cleanup;
-                       }
-               } else {
-                       cl_data->sensor_sts[i] = SENSOR_DISABLED;
                }
                dev_dbg(dev, "sid 0x%x (%s) status 0x%x\n",
                        cl_data->sensor_idx[i], get_sensor_name(cl_data->sensor_idx[i]),
index 01a2757..fd61dba 100644 (file)
@@ -884,33 +884,20 @@ static int asus_input_mapping(struct hid_device *hdev,
                case 0xb5: asus_map_key_clear(KEY_CALC);                        break;
                case 0xc4: asus_map_key_clear(KEY_KBDILLUMUP);          break;
                case 0xc5: asus_map_key_clear(KEY_KBDILLUMDOWN);                break;
+               case 0xc7: asus_map_key_clear(KEY_KBDILLUMTOGGLE);      break;
 
-               /* ASUS touchpad toggle */
-               case 0x6b: asus_map_key_clear(KEY_F21);                 break;
+               case 0x6b: asus_map_key_clear(KEY_F21);         break; /* ASUS touchpad toggle */
+               case 0x38: asus_map_key_clear(KEY_PROG1);       break; /* ROG key */
+               case 0xba: asus_map_key_clear(KEY_PROG2);       break; /* Fn+C ASUS Splendid */
+               case 0x5c: asus_map_key_clear(KEY_PROG3);       break; /* Fn+Space Power4Gear */
+               case 0x99: asus_map_key_clear(KEY_PROG4);       break; /* Fn+F5 "fan" symbol */
+               case 0xae: asus_map_key_clear(KEY_PROG4);       break; /* Fn+F5 "fan" symbol */
+               case 0x92: asus_map_key_clear(KEY_CALC);        break; /* Fn+Ret "Calc" symbol */
+               case 0xb2: asus_map_key_clear(KEY_PROG2);       break; /* Fn+Left previous aura */
+               case 0xb3: asus_map_key_clear(KEY_PROG3);       break; /* Fn+Left next aura */
+               case 0x6a: asus_map_key_clear(KEY_F13);         break; /* Screenpad toggle */
+               case 0x4b: asus_map_key_clear(KEY_F14);         break; /* Arrows/Pg-Up/Dn toggle */
 
-               /* ROG key */
-               case 0x38: asus_map_key_clear(KEY_PROG1);               break;
-
-               /* Fn+C ASUS Splendid */
-               case 0xba: asus_map_key_clear(KEY_PROG2);               break;
-
-               /* Fn+Space Power4Gear Hybrid */
-               case 0x5c: asus_map_key_clear(KEY_PROG3);               break;
-
-               /* Fn+F5 "fan" symbol on FX503VD */
-               case 0x99: asus_map_key_clear(KEY_PROG4);               break;
-
-               /* Fn+F5 "fan" symbol on N-Key keyboard */
-               case 0xae: asus_map_key_clear(KEY_PROG4);               break;
-
-               /* Fn+Ret "Calc" symbol on N-Key keyboard */
-               case 0x92: asus_map_key_clear(KEY_CALC);                break;
-
-               /* Fn+Left Aura mode previous on N-Key keyboard */
-               case 0xb2: asus_map_key_clear(KEY_PROG2);               break;
-
-               /* Fn+Right Aura mode next on N-Key keyboard */
-               case 0xb3: asus_map_key_clear(KEY_PROG3);               break;
 
                default:
                        /* ASUS lazily declares 256 usages, ignore the rest,
@@ -1269,6 +1256,9 @@ static const struct hid_device_id asus_devices[] = {
            USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD2),
          QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD },
        { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,
+           USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD3),
+         QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD },
+       { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,
            USB_DEVICE_ID_ASUSTEK_ROG_CLAYMORE_II_KEYBOARD),
          QUIRK_ROG_CLAYMORE_II_KEYBOARD },
        { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,
@@ -1310,4 +1300,4 @@ static struct hid_driver asus_driver = {
 };
 module_hid_driver(asus_driver);
 
-MODULE_LICENSE("GPL");
+MODULE_LICENSE("GPL");
\ No newline at end of file
index 5d29aba..32b054f 100644 (file)
 #define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD3 0x1822
 #define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD        0x1866
 #define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD2       0x19b6
+#define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD3       0x1a30
 #define USB_DEVICE_ID_ASUSTEK_ROG_CLAYMORE_II_KEYBOARD 0x196b
 #define USB_DEVICE_ID_ASUSTEK_FX503VD_KEYBOARD 0x1869
 
 #define USB_DEVICE_ID_UGCI_FIGHTING    0x0030
 
 #define USB_VENDOR_ID_HP               0x03f0
+#define USB_PRODUCT_ID_HP_ELITE_PRESENTER_MOUSE_464A           0x464a
 #define USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0A4A  0x0a4a
 #define USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0B4A  0x0b4a
 #define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE         0x134a
 #define USB_DEVICE_ID_MS_TYPE_COVER_2    0x07a9
 #define USB_DEVICE_ID_MS_POWER_COVER     0x07da
 #define USB_DEVICE_ID_MS_SURFACE3_COVER                0x07de
-#define USB_DEVICE_ID_MS_XBOX_ONE_S_CONTROLLER 0x02fd
+/*
+ * For a description of the Xbox controller models, refer to:
+ * https://en.wikipedia.org/wiki/Xbox_Wireless_Controller#Summary
+ */
+#define USB_DEVICE_ID_MS_XBOX_CONTROLLER_MODEL_1708    0x02fd
+#define USB_DEVICE_ID_MS_XBOX_CONTROLLER_MODEL_1708_BLE        0x0b20
+#define USB_DEVICE_ID_MS_XBOX_CONTROLLER_MODEL_1914    0x0b13
+#define USB_DEVICE_ID_MS_XBOX_CONTROLLER_MODEL_1797    0x0b05
+#define USB_DEVICE_ID_MS_XBOX_CONTROLLER_MODEL_1797_BLE        0x0b22
 #define USB_DEVICE_ID_MS_PIXART_MOUSE    0x00cb
 #define USB_DEVICE_ID_8BITDO_SN30_PRO_PLUS      0x02e0
 #define USB_DEVICE_ID_MS_MOUSE_0783      0x0783
index 5e1a412..dfe8e09 100644 (file)
@@ -4553,7 +4553,7 @@ static const struct hid_device_id hidpp_devices[] = {
        { /* wireless touchpad T651 */
          HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH,
                USB_DEVICE_ID_LOGITECH_T651),
-         .driver_data = HIDPP_QUIRK_CLASS_WTP },
+         .driver_data = HIDPP_QUIRK_CLASS_WTP | HIDPP_QUIRK_DELAYED_INIT },
        { /* Mouse Logitech Anywhere MX */
          LDJ_DEVICE(0x1017), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_1P0 },
        { /* Mouse logitech M560 */
@@ -4608,6 +4608,8 @@ static const struct hid_device_id hidpp_devices[] = {
          HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC086) },
        { /* Logitech G903 Hero Gaming Mouse over USB */
          HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC091) },
+       { /* Logitech G915 TKL Keyboard over USB */
+         HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC343) },
        { /* Logitech G920 Wheel over USB */
          HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G920_WHEEL),
                .driver_data = HIDPP_QUIRK_CLASS_G920 | HIDPP_QUIRK_FORCE_OUTPUT_REPORTS},
@@ -4630,6 +4632,8 @@ static const struct hid_device_id hidpp_devices[] = {
        { /* MX5500 keyboard over Bluetooth */
          HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb30b),
          .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
+       { /* Logitech G915 TKL keyboard over Bluetooth */
+         HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb35f) },
        { /* M-RCQ142 V470 Cordless Laser Mouse over Bluetooth */
          HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb008) },
        { /* MX Master mouse over Bluetooth */
index 071fd09..9345e2b 100644 (file)
@@ -446,7 +446,16 @@ static const struct hid_device_id ms_devices[] = {
                .driver_data = MS_PRESENTER },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, 0x091B),
                .driver_data = MS_SURFACE_DIAL },
-       { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_XBOX_ONE_S_CONTROLLER),
+
+       { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_XBOX_CONTROLLER_MODEL_1708),
+               .driver_data = MS_QUIRK_FF },
+       { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_XBOX_CONTROLLER_MODEL_1708_BLE),
+               .driver_data = MS_QUIRK_FF },
+       { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_XBOX_CONTROLLER_MODEL_1914),
+               .driver_data = MS_QUIRK_FF },
+       { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_XBOX_CONTROLLER_MODEL_1797),
+               .driver_data = MS_QUIRK_FF },
+       { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_XBOX_CONTROLLER_MODEL_1797_BLE),
                .driver_data = MS_QUIRK_FF },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_8BITDO_SN30_PRO_PLUS),
                .driver_data = MS_QUIRK_FF },
index 804fc03..3983b4f 100644 (file)
@@ -96,6 +96,7 @@ static const struct hid_device_id hid_quirks[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD_A096), HID_QUIRK_NO_INIT_REPORTS },
        { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD_A293), HID_QUIRK_ALWAYS_POLL },
        { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0A4A), HID_QUIRK_ALWAYS_POLL },
+       { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_ELITE_PRESENTER_MOUSE_464A), HID_QUIRK_MULTI_INPUT },
        { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0B4A), HID_QUIRK_ALWAYS_POLL },
        { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE), HID_QUIRK_ALWAYS_POLL },
        { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_094A), HID_QUIRK_ALWAYS_POLL },
index 93e62b1..e63c56a 100644 (file)
@@ -272,7 +272,12 @@ static int hidraw_open(struct inode *inode, struct file *file)
                goto out;
        }
 
-       down_read(&minors_rwsem);
+       /*
+        * Technically not writing to the hidraw_table but a write lock is
+        * required to protect the device refcount. This is symmetrical to
+        * hidraw_release().
+        */
+       down_write(&minors_rwsem);
        if (!hidraw_table[minor] || !hidraw_table[minor]->exist) {
                err = -ENODEV;
                goto out_unlock;
@@ -301,7 +306,7 @@ static int hidraw_open(struct inode *inode, struct file *file)
        spin_unlock_irqrestore(&hidraw_table[minor]->list_lock, flags);
        file->private_data = list;
 out_unlock:
-       up_read(&minors_rwsem);
+       up_write(&minors_rwsem);
 out:
        if (err < 0)
                kfree(list);
index fc108f1..e99f3a3 100644 (file)
@@ -33,6 +33,7 @@
 #define ADL_N_DEVICE_ID                0x54FC
 #define RPL_S_DEVICE_ID                0x7A78
 #define MTL_P_DEVICE_ID                0x7E45
+#define ARL_H_DEVICE_ID                0x7745
 
 #define        REVISION_ID_CHT_A0      0x6
 #define        REVISION_ID_CHT_Ax_SI   0x0
index 7120b30..55cb250 100644 (file)
@@ -44,6 +44,7 @@ static const struct pci_device_id ish_pci_tbl[] = {
        {PCI_DEVICE(PCI_VENDOR_ID_INTEL, ADL_N_DEVICE_ID)},
        {PCI_DEVICE(PCI_VENDOR_ID_INTEL, RPL_S_DEVICE_ID)},
        {PCI_DEVICE(PCI_VENDOR_ID_INTEL, MTL_P_DEVICE_ID)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL, ARL_H_DEVICE_ID)},
        {0, }
 };
 MODULE_DEVICE_TABLE(pci, ish_pci_tbl);