Bluetooth: btmtkuart: Improve exception handling in btmtuart_probe()
authorChuhong Yuan <hslester96@gmail.com>
Fri, 29 May 2020 02:27:26 +0000 (10:27 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 22 Jun 2020 07:30:56 +0000 (09:30 +0200)
[ Upstream commit 4803c54ca24923a30664bea2a7772db6e7303c51 ]

Calls of the functions clk_disable_unprepare() and hci_free_dev()
were missing for the exception handling.
Thus add the missed function calls together with corresponding
jump targets.

Fixes: 055825614c6b ("Bluetooth: btmtkuart: add an implementation for clock osc property")
Signed-off-by: Chuhong Yuan <hslester96@gmail.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/bluetooth/btmtkuart.c

index e11169a..8a81fbc 100644 (file)
@@ -1015,7 +1015,7 @@ static int btmtkuart_probe(struct serdev_device *serdev)
        if (btmtkuart_is_standalone(bdev)) {
                err = clk_prepare_enable(bdev->osc);
                if (err < 0)
-                       return err;
+                       goto err_hci_free_dev;
 
                if (bdev->boot) {
                        gpiod_set_value_cansleep(bdev->boot, 1);
@@ -1028,10 +1028,8 @@ static int btmtkuart_probe(struct serdev_device *serdev)
 
                /* Power on */
                err = regulator_enable(bdev->vcc);
-               if (err < 0) {
-                       clk_disable_unprepare(bdev->osc);
-                       return err;
-               }
+               if (err < 0)
+                       goto err_clk_disable_unprepare;
 
                /* Reset if the reset-gpios is available otherwise the board
                 * -level design should be guaranteed.
@@ -1063,7 +1061,6 @@ static int btmtkuart_probe(struct serdev_device *serdev)
        err = hci_register_dev(hdev);
        if (err < 0) {
                dev_err(&serdev->dev, "Can't register HCI device\n");
-               hci_free_dev(hdev);
                goto err_regulator_disable;
        }
 
@@ -1072,6 +1069,11 @@ static int btmtkuart_probe(struct serdev_device *serdev)
 err_regulator_disable:
        if (btmtkuart_is_standalone(bdev))
                regulator_disable(bdev->vcc);
+err_clk_disable_unprepare:
+       if (btmtkuart_is_standalone(bdev))
+               clk_disable_unprepare(bdev->osc);
+err_hci_free_dev:
+       hci_free_dev(hdev);
 
        return err;
 }