}
irq_set_status_flags(irq, IRQ_NOAUTOEN);
- ret = devm_request_irq(&hdev->dev, irq, btusb_oob_wake_handler,
- 0, "OOB Wake-on-BT", data);
+ ret = request_irq(irq, btusb_oob_wake_handler, 0, "OOB Wake-on-BT", data);
if (ret) {
bt_dev_err(hdev, "%s: IRQ request failed", __func__);
return ret;
ret = device_init_wakeup(dev, true);
if (ret) {
bt_dev_err(hdev, "%s: failed to init_wakeup", __func__);
- return ret;
+ goto err_free_irq;
}
data->oob_wake_irq = irq;
bt_dev_info(hdev, "OOB Wake-on-BT configured at IRQ %u", irq);
+
return 0;
+
+err_free_irq:
+ free_irq(irq, data);
+
+ return ret;
}
#else
static inline int btusb_config_oob_wake(struct hci_dev *hdev)
err_kill_tx_urbs:
usb_kill_anchored_urbs(&data->tx_anchor);
err_disable_wakeup:
- if (data->oob_wake_irq)
+ if (data->oob_wake_irq) {
device_init_wakeup(&data->udev->dev, false);
+ free_irq(data->oob_wake_irq, data);
+ }
out_free_dev:
if (data->reset_gpio)
gpiod_put(data->reset_gpio);
hci_unregister_dev(hdev);
- if (data->oob_wake_irq)
+ if (data->oob_wake_irq) {
device_init_wakeup(&data->udev->dev, false);
+ free_irq(data->oob_wake_irq, data);
+ }
+
if (data->reset_gpio)
gpiod_put(data->reset_gpio);