hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/bluetooth/btmrvl_sdio.c
....@@ -62,13 +62,14 @@
6262 static irqreturn_t btmrvl_wake_irq_bt(int irq, void *priv)
6363 {
6464 struct btmrvl_sdio_card *card = priv;
65
+ struct device *dev = &card->func->dev;
6566 struct btmrvl_plt_wake_cfg *cfg = card->plt_wake_cfg;
6667
67
- pr_info("%s: wake by bt\n", __func__);
68
+ dev_info(dev, "wake by bt\n");
6869 cfg->wake_by_bt = true;
6970 disable_irq_nosync(irq);
7071
71
- pm_wakeup_event(&card->func->dev, 0);
72
+ pm_wakeup_event(dev, 0);
7273 pm_system_wakeup();
7374
7475 return IRQ_HANDLED;
....@@ -87,7 +88,7 @@
8788
8889 if (!dev->of_node ||
8990 !of_match_node(btmrvl_sdio_of_match_table, dev->of_node)) {
90
- pr_err("sdio platform data not available\n");
91
+ dev_info(dev, "sdio device tree data not available\n");
9192 return -1;
9293 }
9394
....@@ -110,6 +111,9 @@
110111 "Failed to request irq_bt %d (%d)\n",
111112 cfg->irq_bt, ret);
112113 }
114
+
115
+ /* Configure wakeup (enabled by default) */
116
+ device_init_wakeup(dev, true);
113117 disable_irq(cfg->irq_bt);
114118 }
115119 }
....@@ -211,7 +215,7 @@
211215 .fw_dump_end = 0xea,
212216 };
213217
214
-static const struct btmrvl_sdio_card_reg btmrvl_reg_8997 = {
218
+static const struct btmrvl_sdio_card_reg btmrvl_reg_89xx = {
215219 .cfg = 0x00,
216220 .host_int_mask = 0x08,
217221 .host_intstatus = 0x0c,
....@@ -228,7 +232,7 @@
228232 .io_port_2 = 0xe6,
229233 .int_read_to_clear = true,
230234 .host_int_rsr = 0x04,
231
- .card_misc_cfg = 0xD8,
235
+ .card_misc_cfg = 0xd8,
232236 .fw_dump_ctrl = 0xf0,
233237 .fw_dump_start = 0xf1,
234238 .fw_dump_end = 0xf8,
....@@ -279,10 +283,28 @@
279283 .supports_fw_dump = true,
280284 };
281285
286
+static const struct btmrvl_sdio_device btmrvl_sdio_sd8977 = {
287
+ .helper = NULL,
288
+ .firmware = "mrvl/sdsd8977_combo_v2.bin",
289
+ .reg = &btmrvl_reg_89xx,
290
+ .support_pscan_win_report = true,
291
+ .sd_blksz_fw_dl = 256,
292
+ .supports_fw_dump = true,
293
+};
294
+
295
+static const struct btmrvl_sdio_device btmrvl_sdio_sd8987 = {
296
+ .helper = NULL,
297
+ .firmware = "mrvl/sd8987_uapsta.bin",
298
+ .reg = &btmrvl_reg_89xx,
299
+ .support_pscan_win_report = true,
300
+ .sd_blksz_fw_dl = 256,
301
+ .supports_fw_dump = true,
302
+};
303
+
282304 static const struct btmrvl_sdio_device btmrvl_sdio_sd8997 = {
283305 .helper = NULL,
284
- .firmware = "mrvl/sd8997_uapsta.bin",
285
- .reg = &btmrvl_reg_8997,
306
+ .firmware = "mrvl/sdsd8997_combo_v4.bin",
307
+ .reg = &btmrvl_reg_89xx,
286308 .support_pscan_win_report = true,
287309 .sd_blksz_fw_dl = 256,
288310 .supports_fw_dump = true,
....@@ -290,25 +312,31 @@
290312
291313 static const struct sdio_device_id btmrvl_sdio_ids[] = {
292314 /* Marvell SD8688 Bluetooth device */
293
- { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x9105),
315
+ { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8688_BT),
294316 .driver_data = (unsigned long)&btmrvl_sdio_sd8688 },
295317 /* Marvell SD8787 Bluetooth device */
296
- { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x911A),
318
+ { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8787_BT),
297319 .driver_data = (unsigned long)&btmrvl_sdio_sd8787 },
298320 /* Marvell SD8787 Bluetooth AMP device */
299
- { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x911B),
321
+ { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8787_BT_AMP),
300322 .driver_data = (unsigned long)&btmrvl_sdio_sd8787 },
301323 /* Marvell SD8797 Bluetooth device */
302
- { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x912A),
324
+ { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8797_BT),
303325 .driver_data = (unsigned long)&btmrvl_sdio_sd8797 },
304326 /* Marvell SD8887 Bluetooth device */
305
- { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x9136),
327
+ { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8887_BT),
306328 .driver_data = (unsigned long)&btmrvl_sdio_sd8887 },
307329 /* Marvell SD8897 Bluetooth device */
308
- { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x912E),
330
+ { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8897_BT),
309331 .driver_data = (unsigned long)&btmrvl_sdio_sd8897 },
332
+ /* Marvell SD8977 Bluetooth device */
333
+ { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8977_BT),
334
+ .driver_data = (unsigned long)&btmrvl_sdio_sd8977 },
335
+ /* Marvell SD8987 Bluetooth device */
336
+ { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8987_BT),
337
+ .driver_data = (unsigned long)&btmrvl_sdio_sd8987 },
310338 /* Marvell SD8997 Bluetooth device */
311
- { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x9142),
339
+ { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8997_BT),
312340 .driver_data = (unsigned long)&btmrvl_sdio_sd8997 },
313341
314342 { } /* Terminating entry */
....@@ -1583,6 +1611,7 @@
15831611 MODULE_SHUTDOWN_REQ);
15841612 btmrvl_sdio_disable_host_int(card);
15851613 }
1614
+
15861615 BT_DBG("unregister dev");
15871616 card->priv->surprise_removed = true;
15881617 btmrvl_sdio_unregister_dev(card);
....@@ -1619,7 +1648,8 @@
16191648 }
16201649
16211650 /* Enable platform specific wakeup interrupt */
1622
- if (card->plt_wake_cfg && card->plt_wake_cfg->irq_bt >= 0) {
1651
+ if (card->plt_wake_cfg && card->plt_wake_cfg->irq_bt >= 0 &&
1652
+ device_may_wakeup(dev)) {
16231653 card->plt_wake_cfg->wake_by_bt = false;
16241654 enable_irq(card->plt_wake_cfg->irq_bt);
16251655 enable_irq_wake(card->plt_wake_cfg->irq_bt);
....@@ -1636,7 +1666,8 @@
16361666 BT_ERR("HS not activated, suspend failed!");
16371667 /* Disable platform specific wakeup interrupt */
16381668 if (card->plt_wake_cfg &&
1639
- card->plt_wake_cfg->irq_bt >= 0) {
1669
+ card->plt_wake_cfg->irq_bt >= 0 &&
1670
+ device_may_wakeup(dev)) {
16401671 disable_irq_wake(card->plt_wake_cfg->irq_bt);
16411672 disable_irq(card->plt_wake_cfg->irq_bt);
16421673 }
....@@ -1696,7 +1727,8 @@
16961727 hci_resume_dev(hcidev);
16971728
16981729 /* Disable platform specific wakeup interrupt */
1699
- if (card->plt_wake_cfg && card->plt_wake_cfg->irq_bt >= 0) {
1730
+ if (card->plt_wake_cfg && card->plt_wake_cfg->irq_bt >= 0 &&
1731
+ device_may_wakeup(dev)) {
17001732 disable_irq_wake(card->plt_wake_cfg->irq_bt);
17011733 disable_irq(card->plt_wake_cfg->irq_bt);
17021734 if (card->plt_wake_cfg->wake_by_bt)
....@@ -1760,4 +1792,6 @@
17601792 MODULE_FIRMWARE("mrvl/sd8797_uapsta.bin");
17611793 MODULE_FIRMWARE("mrvl/sd8887_uapsta.bin");
17621794 MODULE_FIRMWARE("mrvl/sd8897_uapsta.bin");
1763
-MODULE_FIRMWARE("mrvl/sd8997_uapsta.bin");
1795
+MODULE_FIRMWARE("mrvl/sdsd8977_combo_v2.bin");
1796
+MODULE_FIRMWARE("mrvl/sd8987_uapsta.bin");
1797
+MODULE_FIRMWARE("mrvl/sdsd8997_combo_v4.bin");