err = usb_find_common_endpoints(intf->cur_altsetting, &data->bulk_rx_ep,
&data->bulk_tx_ep, &data->intr_ep, NULL);
- if (err) {
- kfree(data);
- return -ENODEV;
- }
+ if (err)
+ goto err_free_data;
if (id->driver_info & BTUSB_AMP) {
data->cmdreq_type = USB_TYPE_CLASS | 0x01;
hdev = hci_alloc_dev_priv(priv_size);
if (!hdev) {
- kfree(data);
- return -ENOMEM;
+ err = -ENOMEM;
+ goto err_free_data;
}
hdev->bus = HCI_USB;
GPIOD_OUT_LOW);
if (IS_ERR(reset_gpio)) {
err = PTR_ERR(reset_gpio);
- goto out_free_dev;
+ goto err_free_hdev;
} else if (reset_gpio) {
data->reset_gpio = reset_gpio;
}
err = btusb_config_oob_wake(hdev);
if (err)
- goto out_free_dev;
+ goto err_put_reset;
/* Marvell devices may need a specific chip configuration */
if (id->driver_info & BTUSB_MARVELL && data->oob_wake_irq) {
device_init_wakeup(&data->udev->dev, false);
free_irq(data->oob_wake_irq, data);
}
-out_free_dev:
+err_put_reset:
if (data->reset_gpio)
gpiod_put(data->reset_gpio);
+err_free_hdev:
hci_free_dev(hdev);
+err_free_data:
kfree(data);
+
return err;
}