Bluetooth: hci_serdev: Move serdev_device_close/open into common hci_serdev code
Make hci_uart_register_device() and hci_uart_unregister_device() call serdev_device_close()/open() themselves instead of relying on the various hci_uart drivers to do this for them. Besides reducing code complexity, this also ensures correct error checking of serdev_device_open(), which was missing in a few drivers. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
parent
412fe29ffc
commit
e9ca08074d
@ -380,10 +380,6 @@ static int bcm_open(struct hci_uart *hu)
|
|||||||
mutex_lock(&bcm_device_lock);
|
mutex_lock(&bcm_device_lock);
|
||||||
|
|
||||||
if (hu->serdev) {
|
if (hu->serdev) {
|
||||||
err = serdev_device_open(hu->serdev);
|
|
||||||
if (err)
|
|
||||||
goto err_free;
|
|
||||||
|
|
||||||
bcm->dev = serdev_device_get_drvdata(hu->serdev);
|
bcm->dev = serdev_device_get_drvdata(hu->serdev);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -420,13 +416,10 @@ out:
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_unset_hu:
|
err_unset_hu:
|
||||||
if (hu->serdev)
|
|
||||||
serdev_device_close(hu->serdev);
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
else
|
if (!hu->serdev)
|
||||||
bcm->dev->hu = NULL;
|
bcm->dev->hu = NULL;
|
||||||
#endif
|
#endif
|
||||||
err_free:
|
|
||||||
mutex_unlock(&bcm_device_lock);
|
mutex_unlock(&bcm_device_lock);
|
||||||
hu->priv = NULL;
|
hu->priv = NULL;
|
||||||
kfree(bcm);
|
kfree(bcm);
|
||||||
@ -445,7 +438,6 @@ static int bcm_close(struct hci_uart *hu)
|
|||||||
mutex_lock(&bcm_device_lock);
|
mutex_lock(&bcm_device_lock);
|
||||||
|
|
||||||
if (hu->serdev) {
|
if (hu->serdev) {
|
||||||
serdev_device_close(hu->serdev);
|
|
||||||
bdev = serdev_device_get_drvdata(hu->serdev);
|
bdev = serdev_device_get_drvdata(hu->serdev);
|
||||||
} else if (bcm_device_exists(bcm->dev)) {
|
} else if (bcm_device_exists(bcm->dev)) {
|
||||||
bdev = bcm->dev;
|
bdev = bcm->dev;
|
||||||
|
@ -141,7 +141,6 @@ static int ll_open(struct hci_uart *hu)
|
|||||||
|
|
||||||
if (hu->serdev) {
|
if (hu->serdev) {
|
||||||
struct ll_device *lldev = serdev_device_get_drvdata(hu->serdev);
|
struct ll_device *lldev = serdev_device_get_drvdata(hu->serdev);
|
||||||
serdev_device_open(hu->serdev);
|
|
||||||
if (!IS_ERR(lldev->ext_clk))
|
if (!IS_ERR(lldev->ext_clk))
|
||||||
clk_prepare_enable(lldev->ext_clk);
|
clk_prepare_enable(lldev->ext_clk);
|
||||||
}
|
}
|
||||||
@ -179,8 +178,6 @@ static int ll_close(struct hci_uart *hu)
|
|||||||
gpiod_set_value_cansleep(lldev->enable_gpio, 0);
|
gpiod_set_value_cansleep(lldev->enable_gpio, 0);
|
||||||
|
|
||||||
clk_disable_unprepare(lldev->ext_clk);
|
clk_disable_unprepare(lldev->ext_clk);
|
||||||
|
|
||||||
serdev_device_close(hu->serdev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hu->priv = NULL;
|
hu->priv = NULL;
|
||||||
|
@ -477,8 +477,6 @@ static int nokia_open(struct hci_uart *hu)
|
|||||||
|
|
||||||
dev_dbg(dev, "protocol open");
|
dev_dbg(dev, "protocol open");
|
||||||
|
|
||||||
serdev_device_open(hu->serdev);
|
|
||||||
|
|
||||||
pm_runtime_enable(dev);
|
pm_runtime_enable(dev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -513,7 +511,6 @@ static int nokia_close(struct hci_uart *hu)
|
|||||||
gpiod_set_value(btdev->wakeup_bt, 0);
|
gpiod_set_value(btdev->wakeup_bt, 0);
|
||||||
|
|
||||||
pm_runtime_disable(&btdev->serdev->dev);
|
pm_runtime_disable(&btdev->serdev->dev);
|
||||||
serdev_device_close(btdev->serdev);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -284,10 +284,14 @@ int hci_uart_register_device(struct hci_uart *hu,
|
|||||||
|
|
||||||
serdev_device_set_client_ops(hu->serdev, &hci_serdev_client_ops);
|
serdev_device_set_client_ops(hu->serdev, &hci_serdev_client_ops);
|
||||||
|
|
||||||
err = p->open(hu);
|
err = serdev_device_open(hu->serdev);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
err = p->open(hu);
|
||||||
|
if (err)
|
||||||
|
goto err_open;
|
||||||
|
|
||||||
hu->proto = p;
|
hu->proto = p;
|
||||||
set_bit(HCI_UART_PROTO_READY, &hu->flags);
|
set_bit(HCI_UART_PROTO_READY, &hu->flags);
|
||||||
|
|
||||||
@ -353,6 +357,8 @@ err_register:
|
|||||||
err_alloc:
|
err_alloc:
|
||||||
clear_bit(HCI_UART_PROTO_READY, &hu->flags);
|
clear_bit(HCI_UART_PROTO_READY, &hu->flags);
|
||||||
p->close(hu);
|
p->close(hu);
|
||||||
|
err_open:
|
||||||
|
serdev_device_close(hu->serdev);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(hci_uart_register_device);
|
EXPORT_SYMBOL_GPL(hci_uart_register_device);
|
||||||
@ -367,5 +373,6 @@ void hci_uart_unregister_device(struct hci_uart *hu)
|
|||||||
cancel_work_sync(&hu->write_work);
|
cancel_work_sync(&hu->write_work);
|
||||||
|
|
||||||
hu->proto->close(hu);
|
hu->proto->close(hu);
|
||||||
|
serdev_device_close(hu->serdev);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(hci_uart_unregister_device);
|
EXPORT_SYMBOL_GPL(hci_uart_unregister_device);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user