Lines Matching +full:mt7921s +full:- +full:bluetooth

1 // SPDX-License-Identifier: GPL-2.0
5 * Bluetooth support for MediaTek SDIO devices
29 #include <net/bluetooth/bluetooth.h>
30 #include <net/bluetooth/hci_core.h>
159 hlen = sizeof(*hdr) + wmt_params->dlen; in mtk_hci_wmt_sync()
161 return -EINVAL; in mtk_hci_wmt_sync()
165 return -ENOMEM; in mtk_hci_wmt_sync()
167 hdr = &wc->hdr; in mtk_hci_wmt_sync()
168 hdr->dir = 1; in mtk_hci_wmt_sync()
169 hdr->op = wmt_params->op; in mtk_hci_wmt_sync()
170 hdr->dlen = cpu_to_le16(wmt_params->dlen + 1); in mtk_hci_wmt_sync()
171 hdr->flag = wmt_params->flag; in mtk_hci_wmt_sync()
172 memcpy(wc->data, wmt_params->data, wmt_params->dlen); in mtk_hci_wmt_sync()
174 set_bit(BTMTKSDIO_TX_WAIT_VND_EVT, &bdev->tx_state); in mtk_hci_wmt_sync()
178 clear_bit(BTMTKSDIO_TX_WAIT_VND_EVT, &bdev->tx_state); in mtk_hci_wmt_sync()
191 err = wait_on_bit_timeout(&bdev->tx_state, BTMTKSDIO_TX_WAIT_VND_EVT, in mtk_hci_wmt_sync()
193 if (err == -EINTR) { in mtk_hci_wmt_sync()
195 clear_bit(BTMTKSDIO_TX_WAIT_VND_EVT, &bdev->tx_state); in mtk_hci_wmt_sync()
201 clear_bit(BTMTKSDIO_TX_WAIT_VND_EVT, &bdev->tx_state); in mtk_hci_wmt_sync()
202 err = -ETIMEDOUT; in mtk_hci_wmt_sync()
207 wmt_evt = (struct btmtk_hci_wmt_evt *)bdev->evt_skb->data; in mtk_hci_wmt_sync()
208 if (wmt_evt->whdr.op != hdr->op) { in mtk_hci_wmt_sync()
210 wmt_evt->whdr.op, hdr->op); in mtk_hci_wmt_sync()
211 err = -EIO; in mtk_hci_wmt_sync()
215 switch (wmt_evt->whdr.op) { in mtk_hci_wmt_sync()
217 if (wmt_evt->whdr.flag == 2) in mtk_hci_wmt_sync()
224 if (be16_to_cpu(wmt_evt_funcc->status) == 0x404) in mtk_hci_wmt_sync()
226 else if (be16_to_cpu(wmt_evt_funcc->status) == 0x420) in mtk_hci_wmt_sync()
232 if (wmt_evt->whdr.flag == 2) in mtk_hci_wmt_sync()
234 else if (wmt_evt->whdr.flag == 1) in mtk_hci_wmt_sync()
241 if (le16_to_cpu(wmt_evt->whdr.dlen) == 12) in mtk_hci_wmt_sync()
242 status = le32_to_cpu(wmt_evt_reg->val); in mtk_hci_wmt_sync()
246 if (wmt_params->status) in mtk_hci_wmt_sync()
247 *wmt_params->status = status; in mtk_hci_wmt_sync()
250 kfree_skb(bdev->evt_skb); in mtk_hci_wmt_sync()
251 bdev->evt_skb = NULL; in mtk_hci_wmt_sync()
275 sdio_hdr = (void *)skb->data; in btmtksdio_tx_packet()
276 sdio_hdr->len = cpu_to_le16(skb->len); in btmtksdio_tx_packet()
277 sdio_hdr->reserved = cpu_to_le16(0); in btmtksdio_tx_packet()
278 sdio_hdr->bt_type = hci_skb_pkt_type(skb); in btmtksdio_tx_packet()
280 clear_bit(BTMTKSDIO_HW_TX_READY, &bdev->tx_state); in btmtksdio_tx_packet()
281 err = sdio_writesb(bdev->func, MTK_REG_CTDR, skb->data, in btmtksdio_tx_packet()
282 round_up(skb->len, MTK_SDIO_BLOCK_SIZE)); in btmtksdio_tx_packet()
286 bdev->hdev->stat.byte_tx += skb->len; in btmtksdio_tx_packet()
300 return sdio_readl(bdev->func, MTK_REG_CHLPCR, NULL); in btmtksdio_drv_own_query()
305 return sdio_readl(bdev->func, MTK_REG_PD2HRM0R, NULL); in btmtksdio_drv_own_query_79xx()
310 return sdio_readl(bdev->func, MTK_REG_CHCR, NULL); in btmtksdio_chcr_query()
318 sdio_claim_host(bdev->func); in btmtksdio_fw_pmctrl()
320 if (bdev->data->lp_mbox_supported && in btmtksdio_fw_pmctrl()
321 test_bit(BTMTKSDIO_PATCH_ENABLED, &bdev->tx_state)) { in btmtksdio_fw_pmctrl()
322 sdio_writel(bdev->func, CSICR_CLR_MBOX_ACK, MTK_REG_CSICR, in btmtksdio_fw_pmctrl()
328 bt_dev_err(bdev->hdev, "mailbox ACK not cleared"); in btmtksdio_fw_pmctrl()
334 sdio_writel(bdev->func, C_FW_OWN_REQ_SET, MTK_REG_CHLPCR, &err); in btmtksdio_fw_pmctrl()
342 sdio_release_host(bdev->func); in btmtksdio_fw_pmctrl()
345 bt_dev_err(bdev->hdev, "Cannot return ownership to device"); in btmtksdio_fw_pmctrl()
355 sdio_claim_host(bdev->func); in btmtksdio_drv_pmctrl()
358 sdio_writel(bdev->func, C_FW_OWN_REQ_CLR, MTK_REG_CHLPCR, &err); in btmtksdio_drv_pmctrl()
365 if (!err && bdev->data->lp_mbox_supported && in btmtksdio_drv_pmctrl()
366 test_bit(BTMTKSDIO_PATCH_ENABLED, &bdev->tx_state)) in btmtksdio_drv_pmctrl()
372 sdio_release_host(bdev->func); in btmtksdio_drv_pmctrl()
375 bt_dev_err(bdev->hdev, "Cannot get ownership from device"); in btmtksdio_drv_pmctrl()
383 struct hci_event_hdr *hdr = (void *)skb->data; in btmtksdio_recv_event()
384 u8 evt = hdr->evt; in btmtksdio_recv_event()
390 if (test_bit(BTMTKSDIO_TX_WAIT_VND_EVT, &bdev->tx_state)) { in btmtksdio_recv_event()
391 bdev->evt_skb = skb_clone(skb, GFP_KERNEL); in btmtksdio_recv_event()
392 if (!bdev->evt_skb) { in btmtksdio_recv_event()
393 err = -ENOMEM; in btmtksdio_recv_event()
404 &bdev->tx_state)) { in btmtksdio_recv_event()
407 wake_up_bit(&bdev->tx_state, BTMTKSDIO_TX_WAIT_VND_EVT); in btmtksdio_recv_event()
414 kfree_skb(bdev->evt_skb); in btmtksdio_recv_event()
415 bdev->evt_skb = NULL; in btmtksdio_recv_event()
424 u16 handle = le16_to_cpu(hci_acl_hdr(skb)->handle); in btmtksdio_recv_acl()
429 * device can no longer suspend and thus disable auto-suspend. in btmtksdio_recv_acl()
431 pm_runtime_forbid(bdev->dev); in btmtksdio_recv_acl()
458 return -EILSEQ; in btmtksdio_rx_packet()
460 /* A SDIO packet is exactly containing a Bluetooth packet */ in btmtksdio_rx_packet()
463 return -ENOMEM; in btmtksdio_rx_packet()
467 err = sdio_readsb(bdev->func, skb->data, MTK_REG_CRDR, rx_size); in btmtksdio_rx_packet()
471 sdio_hdr = (void *)skb->data; in btmtksdio_rx_packet()
473 /* We assume the default error as -EILSEQ simply to make the error path in btmtksdio_rx_packet()
476 err = -EILSEQ; in btmtksdio_rx_packet()
478 if (rx_size != le16_to_cpu(sdio_hdr->len)) { in btmtksdio_rx_packet()
479 bt_dev_err(bdev->hdev, "Rx size in sdio header is mismatched "); in btmtksdio_rx_packet()
483 hci_skb_pkt_type(skb) = sdio_hdr->bt_type; in btmtksdio_rx_packet()
493 if (sdio_hdr->bt_type == (&pkts[i])->type) in btmtksdio_rx_packet()
498 bt_dev_err(bdev->hdev, "Invalid bt type 0x%02x", in btmtksdio_rx_packet()
499 sdio_hdr->bt_type); in btmtksdio_rx_packet()
504 if (skb->len < (&pkts[i])->hlen) { in btmtksdio_rx_packet()
505 bt_dev_err(bdev->hdev, "The size of bt header is mismatched"); in btmtksdio_rx_packet()
509 switch ((&pkts[i])->lsize) { in btmtksdio_rx_packet()
511 dlen = skb->data[(&pkts[i])->loff]; in btmtksdio_rx_packet()
514 dlen = get_unaligned_le16(skb->data + in btmtksdio_rx_packet()
515 (&pkts[i])->loff); in btmtksdio_rx_packet()
521 pad_size = skb->len - (&pkts[i])->hlen - dlen; in btmtksdio_rx_packet()
525 bt_dev_err(bdev->hdev, "The size of bt payload is mismatched"); in btmtksdio_rx_packet()
530 skb_trim(skb, skb->len - pad_size); in btmtksdio_rx_packet()
533 (&pkts[i])->recv(bdev->hdev, skb); in btmtksdio_rx_packet()
535 bdev->hdev->stat.byte_rx += rx_size; in btmtksdio_rx_packet()
554 pm_runtime_get_sync(bdev->dev); in btmtksdio_txrx_work()
556 sdio_claim_host(bdev->func); in btmtksdio_txrx_work()
559 sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, NULL); in btmtksdio_txrx_work()
564 int_status = sdio_readl(bdev->func, MTK_REG_CHISR, NULL); in btmtksdio_txrx_work()
575 sdio_writel(bdev->func, int_status, MTK_REG_CHISR, NULL); in btmtksdio_txrx_work()
579 bdev->data->chipid == 0x7921) { in btmtksdio_txrx_work()
580 sdio_writel(bdev->func, PH2DSM0R_DRIVER_OWN, in btmtksdio_txrx_work()
585 bt_dev_dbg(bdev->hdev, "Get fw own back"); in btmtksdio_txrx_work()
588 set_bit(BTMTKSDIO_HW_TX_READY, &bdev->tx_state); in btmtksdio_txrx_work()
591 bt_dev_warn(bdev->hdev, "Tx fifo overflow"); in btmtksdio_txrx_work()
593 if (test_bit(BTMTKSDIO_HW_TX_READY, &bdev->tx_state)) { in btmtksdio_txrx_work()
594 skb = skb_dequeue(&bdev->txq); in btmtksdio_txrx_work()
598 bdev->hdev->stat.err_tx++; in btmtksdio_txrx_work()
599 skb_queue_head(&bdev->txq, skb); in btmtksdio_txrx_work()
605 rx_size = sdio_readl(bdev->func, MTK_REG_CRPLR, NULL); in btmtksdio_txrx_work()
608 bdev->hdev->stat.err_rx++; in btmtksdio_txrx_work()
613 sdio_writel(bdev->func, C_INT_EN_SET, MTK_REG_CHLPCR, NULL); in btmtksdio_txrx_work()
615 sdio_release_host(bdev->func); in btmtksdio_txrx_work()
617 pm_runtime_mark_last_busy(bdev->dev); in btmtksdio_txrx_work()
618 pm_runtime_put_autosuspend(bdev->dev); in btmtksdio_txrx_work()
625 if (test_bit(BTMTKSDIO_BT_WAKE_ENABLED, &bdev->tx_state)) { in btmtksdio_interrupt()
626 if (bdev->hdev->suspended) in btmtksdio_interrupt()
627 pm_wakeup_event(bdev->dev, 0); in btmtksdio_interrupt()
628 clear_bit(BTMTKSDIO_BT_WAKE_ENABLED, &bdev->tx_state); in btmtksdio_interrupt()
632 sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, NULL); in btmtksdio_interrupt()
634 schedule_work(&bdev->txrx_work); in btmtksdio_interrupt()
643 sdio_claim_host(bdev->func); in btmtksdio_open()
645 err = sdio_enable_func(bdev->func); in btmtksdio_open()
649 set_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state); in btmtksdio_open()
656 sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, &err); in btmtksdio_open()
660 sdio_writel(bdev->func, 0, MTK_REG_CHIER, &err); in btmtksdio_open()
664 err = sdio_claim_irq(bdev->func, btmtksdio_interrupt); in btmtksdio_open()
668 err = sdio_set_block_size(bdev->func, MTK_SDIO_BLOCK_SIZE); in btmtksdio_open()
673 * synchronous interrupt is supported in SDIO 4-bit mode in btmtksdio_open()
675 val = sdio_readl(bdev->func, MTK_REG_CSDIOCSR, &err); in btmtksdio_open()
680 sdio_writel(bdev->func, val, MTK_REG_CSDIOCSR, &err); in btmtksdio_open()
684 /* Explitly set write-1-clear method */ in btmtksdio_open()
685 val = sdio_readl(bdev->func, MTK_REG_CHCR, &err); in btmtksdio_open()
690 sdio_writel(bdev->func, val, MTK_REG_CHCR, &err); in btmtksdio_open()
695 sdio_writel(bdev->func, RX_DONE_INT | TX_EMPTY | TX_FIFO_OVERFLOW, in btmtksdio_open()
701 sdio_writel(bdev->func, C_INT_EN_SET, MTK_REG_CHLPCR, &err); in btmtksdio_open()
705 sdio_release_host(bdev->func); in btmtksdio_open()
710 sdio_release_irq(bdev->func); in btmtksdio_open()
713 sdio_disable_func(bdev->func); in btmtksdio_open()
716 sdio_release_host(bdev->func); in btmtksdio_open()
725 sdio_claim_host(bdev->func); in btmtksdio_close()
728 sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, NULL); in btmtksdio_close()
730 sdio_release_irq(bdev->func); in btmtksdio_close()
732 cancel_work_sync(&bdev->txrx_work); in btmtksdio_close()
736 clear_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state); in btmtksdio_close()
737 sdio_disable_func(bdev->func); in btmtksdio_close()
739 sdio_release_host(bdev->func); in btmtksdio_close()
748 skb_queue_purge(&bdev->txq); in btmtksdio_flush()
750 cancel_work_sync(&bdev->txrx_work); in btmtksdio_flush()
814 /* -ETIMEDOUT happens */ in mt76xx_setup()
827 /* Enable Bluetooth protocol */ in mt76xx_setup()
840 set_bit(BTMTKSDIO_PATCH_ENABLED, &bdev->tx_state); in mt76xx_setup()
883 /* Enable Bluetooth protocol */ in mt79xx_setup()
898 set_bit(BTMTKSDIO_PATCH_ENABLED, &bdev->tx_state); in mt79xx_setup()
970 return -EINVAL; in btmtksdio_get_codec_config_data()
977 return -EINVAL; in btmtksdio_get_codec_config_data()
982 err = -ENOMEM; in btmtksdio_get_codec_config_data()
987 switch (codec->id) { in btmtksdio_get_codec_config_data()
995 err = -EINVAL; in btmtksdio_get_codec_config_data()
996 bt_dev_err(hdev, "Invalid codec id(%u)", codec->id); in btmtksdio_get_codec_config_data()
999 /* codec and its capabilities are pre-defined to ids in btmtksdio_get_codec_config_data()
1048 hdev->get_data_path_id = btmtksdio_get_data_path_id; in btmtksdio_sco_setting()
1049 hdev->get_codec_config_data = btmtksdio_get_codec_config_data; in btmtksdio_sco_setting()
1086 set_bit(BTMTKSDIO_HW_TX_READY, &bdev->tx_state); in btmtksdio_setup()
1088 switch (bdev->data->chipid) { in btmtksdio_setup()
1090 if (test_bit(BTMTKSDIO_HW_RESET_ACTIVE, &bdev->tx_state)) { in btmtksdio_setup()
1106 clear_bit(BTMTKSDIO_HW_RESET_ACTIVE, &bdev->tx_state); in btmtksdio_setup()
1139 set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks); in btmtksdio_setup()
1142 if (bdev->reset) { in btmtksdio_setup()
1146 devm_gpiod_put(bdev->dev, bdev->reset); in btmtksdio_setup()
1147 bdev->reset = NULL; in btmtksdio_setup()
1154 err = mt76xx_setup(hdev, bdev->data->fwname); in btmtksdio_setup()
1159 return -ENODEV; in btmtksdio_setup()
1166 pm_runtime_set_autosuspend_delay(bdev->dev, in btmtksdio_setup()
1168 pm_runtime_use_autosuspend(bdev->dev); in btmtksdio_setup()
1170 err = pm_runtime_set_active(bdev->dev); in btmtksdio_setup()
1177 pm_runtime_forbid(bdev->dev); in btmtksdio_setup()
1178 pm_runtime_enable(bdev->dev); in btmtksdio_setup()
1181 pm_runtime_allow(bdev->dev); in btmtksdio_setup()
1198 pm_runtime_get_sync(bdev->dev); in btmtksdio_shutdown()
1201 if (test_bit(BTMTKSDIO_HW_RESET_ACTIVE, &bdev->tx_state)) in btmtksdio_shutdown()
1218 pm_runtime_put_noidle(bdev->dev); in btmtksdio_shutdown()
1219 pm_runtime_disable(bdev->dev); in btmtksdio_shutdown()
1230 hdev->stat.cmd_tx++; in btmtksdio_send_frame()
1234 hdev->stat.acl_tx++; in btmtksdio_send_frame()
1238 hdev->stat.sco_tx++; in btmtksdio_send_frame()
1242 return -EILSEQ; in btmtksdio_send_frame()
1245 skb_queue_tail(&bdev->txq, skb); in btmtksdio_send_frame()
1247 schedule_work(&bdev->txrx_work); in btmtksdio_send_frame()
1258 if (!bdev->reset || bdev->data->chipid != 0x7921) in btmtksdio_cmd_timeout()
1261 pm_runtime_get_sync(bdev->dev); in btmtksdio_cmd_timeout()
1263 if (test_and_set_bit(BTMTKSDIO_HW_RESET_ACTIVE, &bdev->tx_state)) in btmtksdio_cmd_timeout()
1266 sdio_claim_host(bdev->func); in btmtksdio_cmd_timeout()
1268 sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, NULL); in btmtksdio_cmd_timeout()
1269 skb_queue_purge(&bdev->txq); in btmtksdio_cmd_timeout()
1270 cancel_work_sync(&bdev->txrx_work); in btmtksdio_cmd_timeout()
1272 gpiod_set_value_cansleep(bdev->reset, 1); in btmtksdio_cmd_timeout()
1274 gpiod_set_value_cansleep(bdev->reset, 0); in btmtksdio_cmd_timeout()
1283 clear_bit(BTMTKSDIO_PATCH_ENABLED, &bdev->tx_state); in btmtksdio_cmd_timeout()
1285 sdio_release_host(bdev->func); in btmtksdio_cmd_timeout()
1287 pm_runtime_put_noidle(bdev->dev); in btmtksdio_cmd_timeout()
1288 pm_runtime_disable(bdev->dev); in btmtksdio_cmd_timeout()
1297 return device_may_wakeup(bdev->dev); in btmtksdio_sdio_inband_wakeup()
1303 bool may_wakeup = device_may_wakeup(bdev->dev); in btmtksdio_sdio_wakeup()
1312 if (may_wakeup && bdev->data->chipid == 0x7921) { in btmtksdio_sdio_wakeup()
1333 bdev = devm_kzalloc(&func->dev, sizeof(*bdev), GFP_KERNEL); in btmtksdio_probe()
1335 return -ENOMEM; in btmtksdio_probe()
1337 bdev->data = (void *)id->driver_data; in btmtksdio_probe()
1338 if (!bdev->data) in btmtksdio_probe()
1339 return -ENODEV; in btmtksdio_probe()
1341 bdev->dev = &func->dev; in btmtksdio_probe()
1342 bdev->func = func; in btmtksdio_probe()
1344 INIT_WORK(&bdev->txrx_work, btmtksdio_txrx_work); in btmtksdio_probe()
1345 skb_queue_head_init(&bdev->txq); in btmtksdio_probe()
1350 dev_err(&func->dev, "Can't allocate HCI device\n"); in btmtksdio_probe()
1351 return -ENOMEM; in btmtksdio_probe()
1354 bdev->hdev = hdev; in btmtksdio_probe()
1356 hdev->bus = HCI_SDIO; in btmtksdio_probe()
1359 hdev->open = btmtksdio_open; in btmtksdio_probe()
1360 hdev->close = btmtksdio_close; in btmtksdio_probe()
1361 hdev->cmd_timeout = btmtksdio_cmd_timeout; in btmtksdio_probe()
1362 hdev->flush = btmtksdio_flush; in btmtksdio_probe()
1363 hdev->setup = btmtksdio_setup; in btmtksdio_probe()
1364 hdev->shutdown = btmtksdio_shutdown; in btmtksdio_probe()
1365 hdev->send = btmtksdio_send_frame; in btmtksdio_probe()
1366 hdev->wakeup = btmtksdio_sdio_wakeup; in btmtksdio_probe()
1368 * If SDIO controller supports wake on Bluetooth, sending a wakeon in btmtksdio_probe()
1371 if (device_can_wakeup(func->card->host->parent)) in btmtksdio_probe()
1372 hdev->wakeup = btmtksdio_sdio_inband_wakeup; in btmtksdio_probe()
1374 hdev->wakeup = btmtksdio_sdio_wakeup; in btmtksdio_probe()
1375 hdev->set_bdaddr = btmtk_set_bdaddr; in btmtksdio_probe()
1377 SET_HCIDEV_DEV(hdev, &func->dev); in btmtksdio_probe()
1379 hdev->manufacturer = 70; in btmtksdio_probe()
1380 set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks); in btmtksdio_probe()
1386 dev_err(&func->dev, "Can't register HCI device\n"); in btmtksdio_probe()
1393 * runtime PM for this func such as the case host->caps & in btmtksdio_probe()
1396 if (pm_runtime_enabled(bdev->dev)) in btmtksdio_probe()
1397 pm_runtime_disable(bdev->dev); in btmtksdio_probe()
1408 pm_runtime_put_noidle(bdev->dev); in btmtksdio_probe()
1410 err = device_init_wakeup(bdev->dev, true); in btmtksdio_probe()
1414 bdev->dev->of_node = of_find_compatible_node(NULL, NULL, in btmtksdio_probe()
1415 "mediatek,mt7921s-bluetooth"); in btmtksdio_probe()
1416 bdev->reset = devm_gpiod_get_optional(bdev->dev, "reset", in btmtksdio_probe()
1418 if (IS_ERR(bdev->reset)) in btmtksdio_probe()
1419 err = PTR_ERR(bdev->reset); in btmtksdio_probe()
1433 pm_runtime_get_noresume(bdev->dev); in btmtksdio_remove()
1435 hdev = bdev->hdev; in btmtksdio_remove()
1453 if (!test_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state)) in btmtksdio_runtime_suspend()
1460 bt_dev_dbg(bdev->hdev, "status (%d) return ownership to device", err); in btmtksdio_runtime_suspend()
1474 if (!test_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state)) in btmtksdio_system_suspend()
1477 set_bit(BTMTKSDIO_BT_WAKE_ENABLED, &bdev->tx_state); in btmtksdio_system_suspend()
1492 if (!test_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state)) in btmtksdio_runtime_resume()
1497 bt_dev_dbg(bdev->hdev, "status (%d) get ownership from device", err); in btmtksdio_runtime_resume()
1533 MODULE_DESCRIPTION("MediaTek Bluetooth SDIO driver ver " VERSION);