]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Bluetooth: btmtk: add MT7902 SDIO support
authorSean Wang <sean.wang@mediatek.com>
Tue, 24 Feb 2026 06:13:25 +0000 (00:13 -0600)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 10 Apr 2026 14:26:31 +0000 (10:26 -0400)
Add MT7902 Bluetooth SDIO support by introducing chip data and
registering the device ID.

Runtime PM is not yet supported by the driver, but normal operation
is unaffected.

Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
drivers/bluetooth/btmtksdio.c

index e986e5af51ae1250e9a0151f91ebf5070b94c4bd..042064464d3412e5988a5e28f1abaeed07515f60 100644 (file)
@@ -42,24 +42,35 @@ struct btmtksdio_data {
        const char *fwname;
        u16 chipid;
        bool lp_mbox_supported;
+       bool pm_runtime_supported;
 };
 
 static const struct btmtksdio_data mt7663_data = {
        .fwname = FIRMWARE_MT7663,
        .chipid = 0x7663,
        .lp_mbox_supported = false,
+       .pm_runtime_supported = true,
 };
 
 static const struct btmtksdio_data mt7668_data = {
        .fwname = FIRMWARE_MT7668,
        .chipid = 0x7668,
        .lp_mbox_supported = false,
+       .pm_runtime_supported = true,
 };
 
 static const struct btmtksdio_data mt7921_data = {
        .fwname = FIRMWARE_MT7961,
        .chipid = 0x7921,
        .lp_mbox_supported = true,
+       .pm_runtime_supported = true,
+};
+
+static const struct btmtksdio_data mt7902_data = {
+       .fwname = FIRMWARE_MT7902,
+       .chipid = 0x7902,
+       .lp_mbox_supported = false,
+       .pm_runtime_supported = false,
 };
 
 static const struct sdio_device_id btmtksdio_table[] = {
@@ -69,6 +80,8 @@ static const struct sdio_device_id btmtksdio_table[] = {
         .driver_data = (kernel_ulong_t)&mt7668_data },
        {SDIO_DEVICE(SDIO_VENDOR_ID_MEDIATEK, SDIO_DEVICE_ID_MEDIATEK_MT7961),
         .driver_data = (kernel_ulong_t)&mt7921_data },
+       {SDIO_DEVICE(SDIO_VENDOR_ID_MEDIATEK, SDIO_DEVICE_ID_MEDIATEK_MT7902),
+       .driver_data = (kernel_ulong_t)&mt7902_data },
        { }     /* Terminating entry */
 };
 MODULE_DEVICE_TABLE(sdio, btmtksdio_table);
@@ -1090,6 +1103,7 @@ static int btmtksdio_setup(struct hci_dev *hdev)
        set_bit(BTMTKSDIO_HW_TX_READY, &bdev->tx_state);
 
        switch (bdev->data->chipid) {
+       case 0x7902:
        case 0x7921:
                if (test_bit(BTMTKSDIO_HW_RESET_ACTIVE, &bdev->tx_state)) {
                        err = btmtksdio_mtk_reg_read(hdev, MT7921_DLSTATUS,
@@ -1167,22 +1181,24 @@ static int btmtksdio_setup(struct hci_dev *hdev)
        delta = ktime_sub(rettime, calltime);
        duration = (unsigned long long)ktime_to_ns(delta) >> 10;
 
-       pm_runtime_set_autosuspend_delay(bdev->dev,
-                                        MTKBTSDIO_AUTOSUSPEND_DELAY);
-       pm_runtime_use_autosuspend(bdev->dev);
+       if (bdev->data->pm_runtime_supported) {
+               pm_runtime_set_autosuspend_delay(bdev->dev,
+                                                MTKBTSDIO_AUTOSUSPEND_DELAY);
+               pm_runtime_use_autosuspend(bdev->dev);
 
-       err = pm_runtime_set_active(bdev->dev);
-       if (err < 0)
-               return err;
+               err = pm_runtime_set_active(bdev->dev);
+               if (err < 0)
+                       return err;
 
-       /* Default forbid runtime auto suspend, that can be allowed by
-        * enable_autosuspend flag or the PM runtime entry under sysfs.
-        */
-       pm_runtime_forbid(bdev->dev);
-       pm_runtime_enable(bdev->dev);
+               /* Default forbid runtime auto suspend, that can be allowed by
+                * enable_autosuspend flag or the PM runtime entry under sysfs.
+                */
+               pm_runtime_forbid(bdev->dev);
+               pm_runtime_enable(bdev->dev);
 
-       if (enable_autosuspend)
-               pm_runtime_allow(bdev->dev);
+               if (enable_autosuspend)
+                       pm_runtime_allow(bdev->dev);
+       }
 
        bt_dev_info(hdev, "Device setup in %llu usecs", duration);