diff options
Diffstat (limited to 'drivers/bluetooth/hci_serdev.c')
| -rw-r--r-- | drivers/bluetooth/hci_serdev.c | 10 | 
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/bluetooth/hci_serdev.c b/drivers/bluetooth/hci_serdev.c index c0e5f42ec6b7..f16fd79bc02b 100644 --- a/drivers/bluetooth/hci_serdev.c +++ b/drivers/bluetooth/hci_serdev.c @@ -310,11 +310,12 @@ int hci_uart_register_device(struct hci_uart *hu,  	serdev_device_set_client_ops(hu->serdev, &hci_serdev_client_ops); +	if (percpu_init_rwsem(&hu->proto_lock)) +		return -ENOMEM; +  	err = serdev_device_open(hu->serdev);  	if (err) -		return err; - -	percpu_init_rwsem(&hu->proto_lock); +		goto err_rwsem;  	err = p->open(hu);  	if (err) @@ -389,6 +390,8 @@ err_alloc:  	p->close(hu);  err_open:  	serdev_device_close(hu->serdev); +err_rwsem: +	percpu_free_rwsem(&hu->proto_lock);  	return err;  }  EXPORT_SYMBOL_GPL(hci_uart_register_device); @@ -410,5 +413,6 @@ void hci_uart_unregister_device(struct hci_uart *hu)  		clear_bit(HCI_UART_PROTO_READY, &hu->flags);  		serdev_device_close(hu->serdev);  	} +	percpu_free_rwsem(&hu->proto_lock);  }  EXPORT_SYMBOL_GPL(hci_uart_unregister_device);  |