]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Bluetooth: hci_serdev: Move serdev_device_close/open into common hci_serdev code
authorHans de Goede <hdegoede@redhat.com>
Sun, 27 May 2018 19:04:52 +0000 (21:04 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 30 May 2018 06:47:42 +0000 (08:47 +0200)
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>
drivers/bluetooth/hci_bcm.c
drivers/bluetooth/hci_ll.c
drivers/bluetooth/hci_nokia.c
drivers/bluetooth/hci_serdev.c

index f06f0f1132fb4f804767e037c5393ce1e7930723..ddbd8c6a0cebd5cc7ef5d079533a31383518e5f4 100644 (file)
@@ -380,10 +380,6 @@ static int bcm_open(struct hci_uart *hu)
        mutex_lock(&bcm_device_lock);
 
        if (hu->serdev) {
-               err = serdev_device_open(hu->serdev);
-               if (err)
-                       goto err_free;
-
                bcm->dev = serdev_device_get_drvdata(hu->serdev);
                goto out;
        }
@@ -420,13 +416,10 @@ out:
        return 0;
 
 err_unset_hu:
-       if (hu->serdev)
-               serdev_device_close(hu->serdev);
 #ifdef CONFIG_PM
-       else
+       if (!hu->serdev)
                bcm->dev->hu = NULL;
 #endif
-err_free:
        mutex_unlock(&bcm_device_lock);
        hu->priv = NULL;
        kfree(bcm);
@@ -445,7 +438,6 @@ static int bcm_close(struct hci_uart *hu)
        mutex_lock(&bcm_device_lock);
 
        if (hu->serdev) {
-               serdev_device_close(hu->serdev);
                bdev = serdev_device_get_drvdata(hu->serdev);
        } else if (bcm_device_exists(bcm->dev)) {
                bdev = bcm->dev;
index 27e414b4e3a2de568d63f8b7a883ef7351fccd8c..3e767f245ed52fb3c07dd0f880ef84408568fcde 100644 (file)
@@ -141,7 +141,6 @@ static int ll_open(struct hci_uart *hu)
 
        if (hu->serdev) {
                struct ll_device *lldev = serdev_device_get_drvdata(hu->serdev);
-               serdev_device_open(hu->serdev);
                if (!IS_ERR(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);
 
                clk_disable_unprepare(lldev->ext_clk);
-
-               serdev_device_close(hu->serdev);
        }
 
        hu->priv = NULL;
index 3539fd03f47eec45be42ed6b1be1a7c26b09ddba..14d159e2042d5c488c1e23b3247508aab0a2ebff 100644 (file)
@@ -477,8 +477,6 @@ static int nokia_open(struct hci_uart *hu)
 
        dev_dbg(dev, "protocol open");
 
-       serdev_device_open(hu->serdev);
-
        pm_runtime_enable(dev);
 
        return 0;
@@ -513,7 +511,6 @@ static int nokia_close(struct hci_uart *hu)
        gpiod_set_value(btdev->wakeup_bt, 0);
 
        pm_runtime_disable(&btdev->serdev->dev);
-       serdev_device_close(btdev->serdev);
 
        return 0;
 }
index 6a713f13f71ccef103373ae8a00e6f1821c32564..7a3d6d636192d973ff0b745b70ce7e888131dd2f 100644 (file)
@@ -284,10 +284,14 @@ int hci_uart_register_device(struct hci_uart *hu,
 
        serdev_device_set_client_ops(hu->serdev, &hci_serdev_client_ops);
 
-       err = p->open(hu);
+       err = serdev_device_open(hu->serdev);
        if (err)
                return err;
 
+       err = p->open(hu);
+       if (err)
+               goto err_open;
+
        hu->proto = p;
        set_bit(HCI_UART_PROTO_READY, &hu->flags);
 
@@ -353,6 +357,8 @@ err_register:
 err_alloc:
        clear_bit(HCI_UART_PROTO_READY, &hu->flags);
        p->close(hu);
+err_open:
+       serdev_device_close(hu->serdev);
        return err;
 }
 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);
 
        hu->proto->close(hu);
+       serdev_device_close(hu->serdev);
 }
 EXPORT_SYMBOL_GPL(hci_uart_unregister_device);