]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
Bluetooth: hci_qca: Add QCA Rome power off support to the qca_power_shutdown()
authorRocky Liao <rjliao@codeaurora.org>
Wed, 15 Jan 2020 08:55:50 +0000 (16:55 +0800)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 15 Jan 2020 21:36:57 +0000 (22:36 +0100)
Current qca_power_shutdown() only supports wcn399x, this patch adds Rome
power off support to it. For Rome it just needs to pull down the bt_en
GPIO to power off it. This patch also replaces all the power off operation
in qca_close() with the unified qca_power_shutdown() call.

Signed-off-by: Rocky Liao <rjliao@codeaurora.org>
Reviewed-by: Matthias Kaehlcke <mka@chromium.org>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/bluetooth/hci_qca.c

index 992622dc12638ee81a9ff4a08f0770499273e30c..ecb74965be10831169f1228479be132bb122c8ca 100644 (file)
@@ -663,7 +663,6 @@ static int qca_flush(struct hci_uart *hu)
 /* Close protocol */
 static int qca_close(struct hci_uart *hu)
 {
-       struct qca_serdev *qcadev;
        struct qca_data *qca = hu->priv;
 
        BT_DBG("hu %p qca close", hu);
@@ -679,14 +678,7 @@ static int qca_close(struct hci_uart *hu)
        destroy_workqueue(qca->workqueue);
        qca->hu = NULL;
 
-       if (hu->serdev) {
-               qcadev = serdev_device_get_drvdata(hu->serdev);
-               if (qca_is_wcn399x(qcadev->btsoc_type))
-                       qca_power_shutdown(hu);
-               else
-                       gpiod_set_value_cansleep(qcadev->bt_en, 0);
-
-       }
+       qca_power_shutdown(hu);
 
        kfree_skb(qca->rx_skb);
 
@@ -1685,6 +1677,7 @@ static void qca_power_shutdown(struct hci_uart *hu)
        struct qca_serdev *qcadev;
        struct qca_data *qca = hu->priv;
        unsigned long flags;
+       enum qca_btsoc_type soc_type = qca_soc_type(hu);
 
        qcadev = serdev_device_get_drvdata(hu->serdev);
 
@@ -1697,11 +1690,22 @@ static void qca_power_shutdown(struct hci_uart *hu)
        qca_flush(hu);
        spin_unlock_irqrestore(&qca->hci_ibs_lock, flags);
 
-       host_set_baudrate(hu, 2400);
-       qca_send_power_pulse(hu, false);
-       qca_regulator_disable(qcadev);
        hu->hdev->hw_error = NULL;
        hu->hdev->cmd_timeout = NULL;
+
+       /* Non-serdev device usually is powered by external power
+        * and don't need additional action in driver for power down
+        */
+       if (!hu->serdev)
+               return;
+
+       if (qca_is_wcn399x(soc_type)) {
+               host_set_baudrate(hu, 2400);
+               qca_send_power_pulse(hu, false);
+               qca_regulator_disable(qcadev);
+       } else {
+               gpiod_set_value_cansleep(qcadev->bt_en, 0);
+       }
 }
 
 static int qca_power_off(struct hci_dev *hdev)