Bluetooth: hci_bcm: Make bcm_request_irq fail if no IRQ resource
authorLoic Poulain <loic.poulain@gmail.com>
Tue, 4 Jul 2017 10:57:56 +0000 (12:57 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 20 Jul 2017 09:18:35 +0000 (11:18 +0200)
In case of no IRQ resource associated to the bcm_device, requesting
IRQ should return an error in order to not enable low power mgmt.

Signed-off-by: Loic Poulain <loic.poulain@gmail.com>
Reported-by: Ian Molton <ian@mnementh.co.uk>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/bluetooth/hci_bcm.c

index 6a662d0..6b42372 100644 (file)
@@ -176,7 +176,7 @@ static irqreturn_t bcm_host_wake(int irq, void *data)
 static int bcm_request_irq(struct bcm_data *bcm)
 {
        struct bcm_device *bdev = bcm->dev;
-       int err = 0;
+       int err;
 
        /* If this is not a platform device, do not enable PM functionalities */
        mutex_lock(&bcm_device_lock);
@@ -185,21 +185,23 @@ static int bcm_request_irq(struct bcm_data *bcm)
                goto unlock;
        }
 
-       if (bdev->irq > 0) {
-               err = devm_request_irq(&bdev->pdev->dev, bdev->irq,
-                                      bcm_host_wake, IRQF_TRIGGER_RISING,
-                                      "host_wake", bdev);
-               if (err)
-                       goto unlock;
+       if (bdev->irq <= 0) {
+               err = -EOPNOTSUPP;
+               goto unlock;
+       }
 
-               device_init_wakeup(&bdev->pdev->dev, true);
+       err = devm_request_irq(&bdev->pdev->dev, bdev->irq, bcm_host_wake,
+                              IRQF_TRIGGER_RISING, "host_wake", bdev);
+       if (err)
+               goto unlock;
 
-               pm_runtime_set_autosuspend_delay(&bdev->pdev->dev,
-                                                BCM_AUTOSUSPEND_DELAY);
-               pm_runtime_use_autosuspend(&bdev->pdev->dev);
-               pm_runtime_set_active(&bdev->pdev->dev);
-               pm_runtime_enable(&bdev->pdev->dev);
-       }
+       device_init_wakeup(&bdev->pdev->dev, true);
+
+       pm_runtime_set_autosuspend_delay(&bdev->pdev->dev,
+                                        BCM_AUTOSUSPEND_DELAY);
+       pm_runtime_use_autosuspend(&bdev->pdev->dev);
+       pm_runtime_set_active(&bdev->pdev->dev);
+       pm_runtime_enable(&bdev->pdev->dev);
 
 unlock:
        mutex_unlock(&bcm_device_lock);