Bluetooth: hci_qca: make pwrseq calls the default if available
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Tue, 9 Jul 2024 12:18:35 +0000 (14:18 +0200)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Mon, 15 Jul 2024 14:12:15 +0000 (10:12 -0400)
If the device has a power sequencing handle, use it first. Otherwise
fall back to whatever code already exists.

Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
drivers/bluetooth/hci_qca.c

index 9d2b50c8fc93adfda149f4f0194d36e8fa13827f..49588072589e03806baacd6089cccf94bc7373d3 100644 (file)
@@ -1718,6 +1718,7 @@ static int qca_regulator_init(struct hci_uart *hu)
         * off the voltage regulator.
         */
        qcadev = serdev_device_get_drvdata(hu->serdev);
+
        if (!qcadev->bt_power->vregs_on) {
                serdev_device_close(hu->serdev);
                ret = qca_regulator_enable(qcadev);
@@ -1800,18 +1801,8 @@ static int qca_power_on(struct hci_dev *hdev)
        case QCA_WCN6750:
        case QCA_WCN6855:
        case QCA_WCN7850:
-               ret = qca_regulator_init(hu);
-               break;
-
        case QCA_QCA6390:
-               qcadev = serdev_device_get_drvdata(hu->serdev);
-               ret = pwrseq_power_on(qcadev->bt_power->pwrseq);
-               if (ret)
-                       return ret;
-
-               ret = qca_port_reopen(hu);
-               if (ret)
-                       return ret;
+               ret = qca_regulator_init(hu);
                break;
 
        default:
@@ -2149,6 +2140,7 @@ static void qca_power_shutdown(struct hci_uart *hu)
        unsigned long flags;
        enum qca_btsoc_type soc_type = qca_soc_type(hu);
        bool sw_ctrl_state;
+       struct qca_power *power;
 
        /* From this point we go into power off state. But serial port is
         * still open, stop queueing the IBS data and flush all the buffered
@@ -2166,6 +2158,13 @@ static void qca_power_shutdown(struct hci_uart *hu)
                return;
 
        qcadev = serdev_device_get_drvdata(hu->serdev);
+       power = qcadev->bt_power;
+
+       if (power->pwrseq) {
+               pwrseq_power_off(power->pwrseq);
+               set_bit(QCA_BT_OFF, &qca->flags);
+               return;
+        }
 
        switch (soc_type) {
        case QCA_WCN3988:
@@ -2227,6 +2226,9 @@ static int qca_regulator_enable(struct qca_serdev *qcadev)
        struct qca_power *power = qcadev->bt_power;
        int ret;
 
+       if (power->pwrseq)
+               return pwrseq_power_on(power->pwrseq);
+
        /* Already enabled */
        if (power->vregs_on)
                return 0;