| .. | .. |
|---|
| 62 | 62 | static irqreturn_t btmrvl_wake_irq_bt(int irq, void *priv) |
|---|
| 63 | 63 | { |
|---|
| 64 | 64 | struct btmrvl_sdio_card *card = priv; |
|---|
| 65 | + struct device *dev = &card->func->dev; |
|---|
| 65 | 66 | struct btmrvl_plt_wake_cfg *cfg = card->plt_wake_cfg; |
|---|
| 66 | 67 | |
|---|
| 67 | | - pr_info("%s: wake by bt\n", __func__); |
|---|
| 68 | + dev_info(dev, "wake by bt\n"); |
|---|
| 68 | 69 | cfg->wake_by_bt = true; |
|---|
| 69 | 70 | disable_irq_nosync(irq); |
|---|
| 70 | 71 | |
|---|
| 71 | | - pm_wakeup_event(&card->func->dev, 0); |
|---|
| 72 | + pm_wakeup_event(dev, 0); |
|---|
| 72 | 73 | pm_system_wakeup(); |
|---|
| 73 | 74 | |
|---|
| 74 | 75 | return IRQ_HANDLED; |
|---|
| .. | .. |
|---|
| 87 | 88 | |
|---|
| 88 | 89 | if (!dev->of_node || |
|---|
| 89 | 90 | !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"); |
|---|
| 91 | 92 | return -1; |
|---|
| 92 | 93 | } |
|---|
| 93 | 94 | |
|---|
| .. | .. |
|---|
| 110 | 111 | "Failed to request irq_bt %d (%d)\n", |
|---|
| 111 | 112 | cfg->irq_bt, ret); |
|---|
| 112 | 113 | } |
|---|
| 114 | + |
|---|
| 115 | + /* Configure wakeup (enabled by default) */ |
|---|
| 116 | + device_init_wakeup(dev, true); |
|---|
| 113 | 117 | disable_irq(cfg->irq_bt); |
|---|
| 114 | 118 | } |
|---|
| 115 | 119 | } |
|---|
| .. | .. |
|---|
| 211 | 215 | .fw_dump_end = 0xea, |
|---|
| 212 | 216 | }; |
|---|
| 213 | 217 | |
|---|
| 214 | | -static const struct btmrvl_sdio_card_reg btmrvl_reg_8997 = { |
|---|
| 218 | +static const struct btmrvl_sdio_card_reg btmrvl_reg_89xx = { |
|---|
| 215 | 219 | .cfg = 0x00, |
|---|
| 216 | 220 | .host_int_mask = 0x08, |
|---|
| 217 | 221 | .host_intstatus = 0x0c, |
|---|
| .. | .. |
|---|
| 228 | 232 | .io_port_2 = 0xe6, |
|---|
| 229 | 233 | .int_read_to_clear = true, |
|---|
| 230 | 234 | .host_int_rsr = 0x04, |
|---|
| 231 | | - .card_misc_cfg = 0xD8, |
|---|
| 235 | + .card_misc_cfg = 0xd8, |
|---|
| 232 | 236 | .fw_dump_ctrl = 0xf0, |
|---|
| 233 | 237 | .fw_dump_start = 0xf1, |
|---|
| 234 | 238 | .fw_dump_end = 0xf8, |
|---|
| .. | .. |
|---|
| 279 | 283 | .supports_fw_dump = true, |
|---|
| 280 | 284 | }; |
|---|
| 281 | 285 | |
|---|
| 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 | + |
|---|
| 282 | 304 | static const struct btmrvl_sdio_device btmrvl_sdio_sd8997 = { |
|---|
| 283 | 305 | .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, |
|---|
| 286 | 308 | .support_pscan_win_report = true, |
|---|
| 287 | 309 | .sd_blksz_fw_dl = 256, |
|---|
| 288 | 310 | .supports_fw_dump = true, |
|---|
| .. | .. |
|---|
| 290 | 312 | |
|---|
| 291 | 313 | static const struct sdio_device_id btmrvl_sdio_ids[] = { |
|---|
| 292 | 314 | /* 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), |
|---|
| 294 | 316 | .driver_data = (unsigned long)&btmrvl_sdio_sd8688 }, |
|---|
| 295 | 317 | /* 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), |
|---|
| 297 | 319 | .driver_data = (unsigned long)&btmrvl_sdio_sd8787 }, |
|---|
| 298 | 320 | /* 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), |
|---|
| 300 | 322 | .driver_data = (unsigned long)&btmrvl_sdio_sd8787 }, |
|---|
| 301 | 323 | /* 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), |
|---|
| 303 | 325 | .driver_data = (unsigned long)&btmrvl_sdio_sd8797 }, |
|---|
| 304 | 326 | /* 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), |
|---|
| 306 | 328 | .driver_data = (unsigned long)&btmrvl_sdio_sd8887 }, |
|---|
| 307 | 329 | /* 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), |
|---|
| 309 | 331 | .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 }, |
|---|
| 310 | 338 | /* 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), |
|---|
| 312 | 340 | .driver_data = (unsigned long)&btmrvl_sdio_sd8997 }, |
|---|
| 313 | 341 | |
|---|
| 314 | 342 | { } /* Terminating entry */ |
|---|
| .. | .. |
|---|
| 1583 | 1611 | MODULE_SHUTDOWN_REQ); |
|---|
| 1584 | 1612 | btmrvl_sdio_disable_host_int(card); |
|---|
| 1585 | 1613 | } |
|---|
| 1614 | + |
|---|
| 1586 | 1615 | BT_DBG("unregister dev"); |
|---|
| 1587 | 1616 | card->priv->surprise_removed = true; |
|---|
| 1588 | 1617 | btmrvl_sdio_unregister_dev(card); |
|---|
| .. | .. |
|---|
| 1619 | 1648 | } |
|---|
| 1620 | 1649 | |
|---|
| 1621 | 1650 | /* 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)) { |
|---|
| 1623 | 1653 | card->plt_wake_cfg->wake_by_bt = false; |
|---|
| 1624 | 1654 | enable_irq(card->plt_wake_cfg->irq_bt); |
|---|
| 1625 | 1655 | enable_irq_wake(card->plt_wake_cfg->irq_bt); |
|---|
| .. | .. |
|---|
| 1636 | 1666 | BT_ERR("HS not activated, suspend failed!"); |
|---|
| 1637 | 1667 | /* Disable platform specific wakeup interrupt */ |
|---|
| 1638 | 1668 | 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)) { |
|---|
| 1640 | 1671 | disable_irq_wake(card->plt_wake_cfg->irq_bt); |
|---|
| 1641 | 1672 | disable_irq(card->plt_wake_cfg->irq_bt); |
|---|
| 1642 | 1673 | } |
|---|
| .. | .. |
|---|
| 1696 | 1727 | hci_resume_dev(hcidev); |
|---|
| 1697 | 1728 | |
|---|
| 1698 | 1729 | /* 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)) { |
|---|
| 1700 | 1732 | disable_irq_wake(card->plt_wake_cfg->irq_bt); |
|---|
| 1701 | 1733 | disable_irq(card->plt_wake_cfg->irq_bt); |
|---|
| 1702 | 1734 | if (card->plt_wake_cfg->wake_by_bt) |
|---|
| .. | .. |
|---|
| 1760 | 1792 | MODULE_FIRMWARE("mrvl/sd8797_uapsta.bin"); |
|---|
| 1761 | 1793 | MODULE_FIRMWARE("mrvl/sd8887_uapsta.bin"); |
|---|
| 1762 | 1794 | 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"); |
|---|