]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Bluetooth: btmtksdio: Add pmctrl handling for BT closed state during reset
authorChris Lu <chris.lu@mediatek.com>
Tue, 30 Sep 2025 05:39:33 +0000 (13:39 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Nov 2025 20:36:40 +0000 (15:36 -0500)
[ Upstream commit 77343b8b4f87560f8f03e77b98a81ff3a147b262 ]

This patch adds logic to handle power management control when the
Bluetooth function is closed during the SDIO reset sequence.

Specifically, if BT is closed before reset, the driver enables the
SDIO function and sets driver pmctrl. After reset, if BT remains
closed, the driver sets firmware pmctrl and disables the SDIO function.

These changes ensure proper power management and device state consistency
across the reset flow.

Fixes: 8fafe702253d ("Bluetooth: mt7921s: support bluetooth reset mechanism")
Signed-off-by: Chris Lu <chris.lu@mediatek.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/bluetooth/btmtksdio.c

index 4fc673640bfce806b437e97349b8cc3301b12bc6..24ce1bf660669d8301675dd57a0f395f0d78be2d 100644 (file)
@@ -1270,6 +1270,12 @@ static void btmtksdio_reset(struct hci_dev *hdev)
 
        sdio_claim_host(bdev->func);
 
+       /* set drv_pmctrl if BT is closed before doing reset */
+       if (!test_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state)) {
+               sdio_enable_func(bdev->func);
+               btmtksdio_drv_pmctrl(bdev);
+       }
+
        sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, NULL);
        skb_queue_purge(&bdev->txq);
        cancel_work_sync(&bdev->txrx_work);
@@ -1285,6 +1291,12 @@ static void btmtksdio_reset(struct hci_dev *hdev)
                goto err;
        }
 
+       /* set fw_pmctrl back if BT is closed after doing reset */
+       if (!test_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state)) {
+               btmtksdio_fw_pmctrl(bdev);
+               sdio_disable_func(bdev->func);
+       }
+
        clear_bit(BTMTKSDIO_PATCH_ENABLED, &bdev->tx_state);
 err:
        sdio_release_host(bdev->func);