Merge branch 'for-5.10/i2c-hid' into for-linus
authorJiri Kosina <jkosina@suse.cz>
Thu, 15 Oct 2020 18:39:08 +0000 (20:39 +0200)
committerJiri Kosina <jkosina@suse.cz>
Thu, 15 Oct 2020 18:39:08 +0000 (20:39 +0200)
- prefer async probing in i2c-hid even if built-in

drivers/hid/hid-apple.c
drivers/hid/hid-cp2112.c
drivers/hid/hid-debug.c

index e82f604..6b8f0d0 100644 (file)
@@ -503,6 +503,8 @@ static const struct hid_device_id apple_devices[] = {
                .driver_data = APPLE_HAS_FN },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ISO),
                .driver_data = APPLE_HAS_FN },
+       { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ISO),
+               .driver_data = APPLE_HAS_FN },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_JIS),
                .driver_data = APPLE_HAS_FN },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI),
index f64517b..21e1562 100644 (file)
@@ -1235,6 +1235,7 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)
        struct cp2112_device *dev;
        u8 buf[3];
        struct cp2112_smbus_config_report config;
+       struct gpio_irq_chip *girq;
        int ret;
 
        dev = devm_kzalloc(&hdev->dev, sizeof(*dev), GFP_KERNEL);
@@ -1338,6 +1339,15 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)
        dev->gc.can_sleep               = 1;
        dev->gc.parent                  = &hdev->dev;
 
+       girq = &dev->gc.irq;
+       girq->chip = &cp2112_gpio_irqchip;
+       /* The event comes from the outside so no parent handler */
+       girq->parent_handler = NULL;
+       girq->num_parents = 0;
+       girq->parents = NULL;
+       girq->default_type = IRQ_TYPE_NONE;
+       girq->handler = handle_simple_irq;
+
        ret = gpiochip_add_data(&dev->gc, dev);
        if (ret < 0) {
                hid_err(hdev, "error registering gpio chip\n");
@@ -1353,17 +1363,8 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)
        chmod_sysfs_attrs(hdev);
        hid_hw_power(hdev, PM_HINT_NORMAL);
 
-       ret = gpiochip_irqchip_add(&dev->gc, &cp2112_gpio_irqchip, 0,
-                                  handle_simple_irq, IRQ_TYPE_NONE);
-       if (ret) {
-               dev_err(dev->gc.parent, "failed to add IRQ chip\n");
-               goto err_sysfs_remove;
-       }
-
        return ret;
 
-err_sysfs_remove:
-       sysfs_remove_group(&hdev->dev.kobj, &cp2112_attr_group);
 err_gpiochip_remove:
        gpiochip_remove(&dev->gc);
 err_free_i2c:
index 9453147..d7eaf91 100644 (file)
@@ -1101,11 +1101,6 @@ static ssize_t hid_debug_events_read(struct file *file, char __user *buffer,
                set_current_state(TASK_INTERRUPTIBLE);
 
                while (kfifo_is_empty(&list->hid_debug_fifo)) {
-                       if (file->f_flags & O_NONBLOCK) {
-                               ret = -EAGAIN;
-                               break;
-                       }
-
                        if (signal_pending(current)) {
                                ret = -ERESTARTSYS;
                                break;
@@ -1122,6 +1117,11 @@ static ssize_t hid_debug_events_read(struct file *file, char __user *buffer,
                                goto out;
                        }
 
+                       if (file->f_flags & O_NONBLOCK) {
+                               ret = -EAGAIN;
+                               break;
+                       }
+
                        /* allow O_NONBLOCK from other threads */
                        mutex_unlock(&list->read_mutex);
                        schedule();