Lines Matching refs:bdev

149 	struct btmtksdio_dev *bdev = hci_get_drvdata(hdev);  in mtk_hci_wmt_sync()  local
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()
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()
207 wmt_evt = (struct btmtk_hci_wmt_evt *)bdev->evt_skb->data; 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()
258 static int btmtksdio_tx_packet(struct btmtksdio_dev *bdev, in btmtksdio_tx_packet() argument
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()
286 bdev->hdev->stat.byte_tx += skb->len; in btmtksdio_tx_packet()
298 static u32 btmtksdio_drv_own_query(struct btmtksdio_dev *bdev) in btmtksdio_drv_own_query() argument
300 return sdio_readl(bdev->func, MTK_REG_CHLPCR, NULL); in btmtksdio_drv_own_query()
303 static u32 btmtksdio_drv_own_query_79xx(struct btmtksdio_dev *bdev) in btmtksdio_drv_own_query_79xx() argument
305 return sdio_readl(bdev->func, MTK_REG_PD2HRM0R, NULL); in btmtksdio_drv_own_query_79xx()
308 static u32 btmtksdio_chcr_query(struct btmtksdio_dev *bdev) in btmtksdio_chcr_query() argument
310 return sdio_readl(bdev->func, MTK_REG_CHCR, NULL); in btmtksdio_chcr_query()
313 static int btmtksdio_fw_pmctrl(struct btmtksdio_dev *bdev) in btmtksdio_fw_pmctrl() argument
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()
324 err = readx_poll_timeout(btmtksdio_drv_own_query_79xx, bdev, 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()
338 err = readx_poll_timeout(btmtksdio_drv_own_query, bdev, status, 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()
350 static int btmtksdio_drv_pmctrl(struct btmtksdio_dev *bdev) in btmtksdio_drv_pmctrl() argument
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()
362 err = readx_poll_timeout(btmtksdio_drv_own_query, bdev, status, 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()
367 err = readx_poll_timeout(btmtksdio_drv_own_query_79xx, bdev, 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()
382 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev); in btmtksdio_recv_event() local
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()
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()
423 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev); in btmtksdio_recv_acl() local
431 pm_runtime_forbid(bdev->dev); in btmtksdio_recv_acl()
448 static int btmtksdio_rx_packet(struct btmtksdio_dev *bdev, u16 rx_size) in btmtksdio_rx_packet() argument
467 err = sdio_readsb(bdev->func, skb->data, MTK_REG_CRDR, rx_size); in btmtksdio_rx_packet()
479 bt_dev_err(bdev->hdev, "Rx size in sdio header is mismatched "); in btmtksdio_rx_packet()
498 bt_dev_err(bdev->hdev, "Invalid bt type 0x%02x", in btmtksdio_rx_packet()
505 bt_dev_err(bdev->hdev, "The size of bt header is mismatched"); in btmtksdio_rx_packet()
525 bt_dev_err(bdev->hdev, "The size of bt payload is mismatched"); 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()
547 struct btmtksdio_dev *bdev = container_of(work, struct btmtksdio_dev, in btmtksdio_txrx_work() local
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()
596 err = btmtksdio_tx_packet(bdev, skb); 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()
607 if (btmtksdio_rx_packet(bdev, rx_size) < 0) in btmtksdio_txrx_work()
608 bdev->hdev->stat.err_rx++; in btmtksdio_txrx_work()
613 if (bdev->func->irq_handler) in btmtksdio_txrx_work()
614 sdio_writel(bdev->func, C_INT_EN_SET, MTK_REG_CHLPCR, NULL); in btmtksdio_txrx_work()
616 sdio_release_host(bdev->func); in btmtksdio_txrx_work()
618 pm_runtime_mark_last_busy(bdev->dev); in btmtksdio_txrx_work()
619 pm_runtime_put_autosuspend(bdev->dev); in btmtksdio_txrx_work()
624 struct btmtksdio_dev *bdev = sdio_get_drvdata(func); in btmtksdio_interrupt() local
626 if (test_bit(BTMTKSDIO_BT_WAKE_ENABLED, &bdev->tx_state)) { in btmtksdio_interrupt()
627 if (bdev->hdev->suspended) in btmtksdio_interrupt()
628 pm_wakeup_event(bdev->dev, 0); in btmtksdio_interrupt()
629 clear_bit(BTMTKSDIO_BT_WAKE_ENABLED, &bdev->tx_state); in btmtksdio_interrupt()
633 sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, NULL); in btmtksdio_interrupt()
635 schedule_work(&bdev->txrx_work); in btmtksdio_interrupt()
640 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev); in btmtksdio_open() local
644 sdio_claim_host(bdev->func); in btmtksdio_open()
646 err = sdio_enable_func(bdev->func); in btmtksdio_open()
650 set_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state); in btmtksdio_open()
652 err = btmtksdio_drv_pmctrl(bdev); in btmtksdio_open()
657 sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, &err); in btmtksdio_open()
661 sdio_writel(bdev->func, 0, MTK_REG_CHIER, &err); in btmtksdio_open()
665 err = sdio_claim_irq(bdev->func, btmtksdio_interrupt); in btmtksdio_open()
669 err = sdio_set_block_size(bdev->func, MTK_SDIO_BLOCK_SIZE); in btmtksdio_open()
676 val = sdio_readl(bdev->func, MTK_REG_CSDIOCSR, &err); in btmtksdio_open()
681 sdio_writel(bdev->func, val, MTK_REG_CSDIOCSR, &err); in btmtksdio_open()
686 val = sdio_readl(bdev->func, MTK_REG_CHCR, &err); in btmtksdio_open()
691 sdio_writel(bdev->func, val, MTK_REG_CHCR, &err); in btmtksdio_open()
696 sdio_writel(bdev->func, RX_DONE_INT | TX_EMPTY | TX_FIFO_OVERFLOW, in btmtksdio_open()
702 sdio_writel(bdev->func, C_INT_EN_SET, MTK_REG_CHLPCR, &err); in btmtksdio_open()
706 sdio_release_host(bdev->func); in btmtksdio_open()
711 sdio_release_irq(bdev->func); in btmtksdio_open()
714 sdio_disable_func(bdev->func); in btmtksdio_open()
717 sdio_release_host(bdev->func); in btmtksdio_open()
724 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev); in btmtksdio_close() local
727 if (!test_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state)) in btmtksdio_close()
730 sdio_claim_host(bdev->func); in btmtksdio_close()
733 sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, NULL); in btmtksdio_close()
735 sdio_release_irq(bdev->func); in btmtksdio_close()
737 cancel_work_sync(&bdev->txrx_work); in btmtksdio_close()
739 btmtksdio_fw_pmctrl(bdev); in btmtksdio_close()
741 clear_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state); in btmtksdio_close()
742 sdio_disable_func(bdev->func); in btmtksdio_close()
744 sdio_release_host(bdev->func); in btmtksdio_close()
751 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev); in btmtksdio_flush() local
753 skb_queue_purge(&bdev->txq); in btmtksdio_flush()
755 cancel_work_sync(&bdev->txrx_work); in btmtksdio_flush()
784 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev); in mt76xx_setup() local
845 set_bit(BTMTKSDIO_PATCH_ENABLED, &bdev->tx_state); in mt76xx_setup()
869 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev); in mt79xx_setup() local
880 err = btmtksdio_fw_pmctrl(bdev); in mt79xx_setup()
884 err = btmtksdio_drv_pmctrl(bdev); in mt79xx_setup()
903 set_bit(BTMTKSDIO_PATCH_ENABLED, &bdev->tx_state); in mt79xx_setup()
1083 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev); in btmtksdio_setup() local
1091 set_bit(BTMTKSDIO_HW_TX_READY, &bdev->tx_state); in btmtksdio_setup()
1093 switch (bdev->data->chipid) { in btmtksdio_setup()
1095 if (test_bit(BTMTKSDIO_HW_RESET_ACTIVE, &bdev->tx_state)) { in btmtksdio_setup()
1107 btmtksdio_fw_pmctrl(bdev); in btmtksdio_setup()
1109 btmtksdio_drv_pmctrl(bdev); in btmtksdio_setup()
1111 clear_bit(BTMTKSDIO_HW_RESET_ACTIVE, &bdev->tx_state); in btmtksdio_setup()
1147 if (bdev->reset) { in btmtksdio_setup()
1151 devm_gpiod_put(bdev->dev, bdev->reset); in btmtksdio_setup()
1152 bdev->reset = NULL; in btmtksdio_setup()
1159 err = mt76xx_setup(hdev, bdev->data->fwname); in btmtksdio_setup()
1171 pm_runtime_set_autosuspend_delay(bdev->dev, in btmtksdio_setup()
1173 pm_runtime_use_autosuspend(bdev->dev); in btmtksdio_setup()
1175 err = pm_runtime_set_active(bdev->dev); in btmtksdio_setup()
1182 pm_runtime_forbid(bdev->dev); in btmtksdio_setup()
1183 pm_runtime_enable(bdev->dev); in btmtksdio_setup()
1186 pm_runtime_allow(bdev->dev); in btmtksdio_setup()
1195 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev); in btmtksdio_shutdown() local
1203 pm_runtime_get_sync(bdev->dev); in btmtksdio_shutdown()
1206 if (test_bit(BTMTKSDIO_HW_RESET_ACTIVE, &bdev->tx_state)) in btmtksdio_shutdown()
1223 pm_runtime_put_noidle(bdev->dev); in btmtksdio_shutdown()
1224 pm_runtime_disable(bdev->dev); in btmtksdio_shutdown()
1231 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev); in btmtksdio_send_frame() local
1250 skb_queue_tail(&bdev->txq, skb); in btmtksdio_send_frame()
1252 schedule_work(&bdev->txrx_work); in btmtksdio_send_frame()
1259 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev); in btmtksdio_reset() local
1263 if (!bdev->reset || bdev->data->chipid != 0x7921) in btmtksdio_reset()
1266 pm_runtime_get_sync(bdev->dev); in btmtksdio_reset()
1268 if (test_and_set_bit(BTMTKSDIO_HW_RESET_ACTIVE, &bdev->tx_state)) in btmtksdio_reset()
1271 sdio_claim_host(bdev->func); in btmtksdio_reset()
1273 sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, NULL); in btmtksdio_reset()
1274 skb_queue_purge(&bdev->txq); in btmtksdio_reset()
1275 cancel_work_sync(&bdev->txrx_work); in btmtksdio_reset()
1277 gpiod_set_value_cansleep(bdev->reset, 1); in btmtksdio_reset()
1279 gpiod_set_value_cansleep(bdev->reset, 0); in btmtksdio_reset()
1281 err = readx_poll_timeout(btmtksdio_chcr_query, bdev, status, in btmtksdio_reset()
1288 clear_bit(BTMTKSDIO_PATCH_ENABLED, &bdev->tx_state); in btmtksdio_reset()
1290 sdio_release_host(bdev->func); in btmtksdio_reset()
1292 pm_runtime_put_noidle(bdev->dev); in btmtksdio_reset()
1293 pm_runtime_disable(bdev->dev); in btmtksdio_reset()
1300 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev); in btmtksdio_sdio_inband_wakeup() local
1302 return device_may_wakeup(bdev->dev); in btmtksdio_sdio_inband_wakeup()
1307 struct btmtksdio_dev *bdev = hci_get_drvdata(hdev); in btmtksdio_sdio_wakeup() local
1308 bool may_wakeup = device_may_wakeup(bdev->dev); in btmtksdio_sdio_wakeup()
1317 if (may_wakeup && bdev->data->chipid == 0x7921) { in btmtksdio_sdio_wakeup()
1334 struct btmtksdio_dev *bdev; in btmtksdio_probe() local
1340 bdev = devm_kzalloc(&func->dev, sizeof(*bdev), GFP_KERNEL); in btmtksdio_probe()
1341 if (!bdev) in btmtksdio_probe()
1344 bdev->data = (void *)id->driver_data; in btmtksdio_probe()
1345 if (!bdev->data) in btmtksdio_probe()
1348 bdev->dev = &func->dev; in btmtksdio_probe()
1349 bdev->func = func; in btmtksdio_probe()
1351 INIT_WORK(&bdev->txrx_work, btmtksdio_txrx_work); in btmtksdio_probe()
1352 skb_queue_head_init(&bdev->txq); in btmtksdio_probe()
1361 bdev->hdev = hdev; in btmtksdio_probe()
1364 hci_set_drvdata(hdev, bdev); in btmtksdio_probe()
1389 sdio_set_drvdata(func, bdev); in btmtksdio_probe()
1403 if (pm_runtime_enabled(bdev->dev)) in btmtksdio_probe()
1404 pm_runtime_disable(bdev->dev); in btmtksdio_probe()
1415 pm_runtime_put_noidle(bdev->dev); in btmtksdio_probe()
1417 err = devm_device_init_wakeup(bdev->dev); in btmtksdio_probe()
1422 if (!of_device_is_compatible(bdev->dev->of_node, "mediatek,mt7921s-bluetooth")) { in btmtksdio_probe()
1424 old_node = bdev->dev->of_node; in btmtksdio_probe()
1425 bdev->dev->of_node = of_find_compatible_node(NULL, NULL, in btmtksdio_probe()
1429 bdev->reset = devm_gpiod_get_optional(bdev->dev, "reset", in btmtksdio_probe()
1431 if (IS_ERR(bdev->reset)) in btmtksdio_probe()
1432 err = PTR_ERR(bdev->reset); in btmtksdio_probe()
1435 of_node_put(bdev->dev->of_node); in btmtksdio_probe()
1436 bdev->dev->of_node = old_node; in btmtksdio_probe()
1444 struct btmtksdio_dev *bdev = sdio_get_drvdata(func); in btmtksdio_remove() local
1447 if (!bdev) in btmtksdio_remove()
1450 hdev = bdev->hdev; in btmtksdio_remove()
1453 if (test_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state)) in btmtksdio_remove()
1457 pm_runtime_get_noresume(bdev->dev); in btmtksdio_remove()
1468 struct btmtksdio_dev *bdev; in btmtksdio_runtime_suspend() local
1471 bdev = sdio_get_drvdata(func); in btmtksdio_runtime_suspend()
1472 if (!bdev) in btmtksdio_runtime_suspend()
1475 if (!test_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state)) in btmtksdio_runtime_suspend()
1480 err = btmtksdio_fw_pmctrl(bdev); in btmtksdio_runtime_suspend()
1482 bt_dev_dbg(bdev->hdev, "status (%d) return ownership to device", err); in btmtksdio_runtime_suspend()
1490 struct btmtksdio_dev *bdev; in btmtksdio_system_suspend() local
1492 bdev = sdio_get_drvdata(func); in btmtksdio_system_suspend()
1493 if (!bdev) in btmtksdio_system_suspend()
1496 if (!test_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state)) in btmtksdio_system_suspend()
1499 set_bit(BTMTKSDIO_BT_WAKE_ENABLED, &bdev->tx_state); in btmtksdio_system_suspend()
1507 struct btmtksdio_dev *bdev; in btmtksdio_runtime_resume() local
1510 bdev = sdio_get_drvdata(func); in btmtksdio_runtime_resume()
1511 if (!bdev) in btmtksdio_runtime_resume()
1514 if (!test_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state)) in btmtksdio_runtime_resume()
1517 err = btmtksdio_drv_pmctrl(bdev); in btmtksdio_runtime_resume()
1519 bt_dev_dbg(bdev->hdev, "status (%d) get ownership from device", err); in btmtksdio_runtime_resume()