Lines Matching +full:serial +full:- +full:clk +full:- +full:low
1 // SPDX-License-Identifier: GPL-2.0
5 * Bluetooth support for MediaTek serial devices
13 #include <linux/clk.h>
119 struct clk *clk; member
120 struct clk *osc;
145 ((bdev)->data->flags & BTMTKUART_FLAG_STANDALONE_HW)
147 !((bdev)->data->flags & BTMTKUART_FLAG_STANDALONE_HW)
160 hlen = sizeof(*hdr) + wmt_params->dlen; in mtk_hci_wmt_sync()
162 err = -EINVAL; in mtk_hci_wmt_sync()
167 hdr->dir = 1; in mtk_hci_wmt_sync()
168 hdr->op = wmt_params->op; in mtk_hci_wmt_sync()
169 hdr->dlen = cpu_to_le16(wmt_params->dlen + 1); in mtk_hci_wmt_sync()
170 hdr->flag = wmt_params->flag; in mtk_hci_wmt_sync()
171 memcpy(wc.data, wmt_params->data, wmt_params->dlen); in mtk_hci_wmt_sync()
173 set_bit(BTMTKUART_TX_WAIT_VND_EVT, &bdev->tx_state); in mtk_hci_wmt_sync()
177 clear_bit(BTMTKUART_TX_WAIT_VND_EVT, &bdev->tx_state); in mtk_hci_wmt_sync()
190 err = wait_on_bit_timeout(&bdev->tx_state, BTMTKUART_TX_WAIT_VND_EVT, in mtk_hci_wmt_sync()
192 if (err == -EINTR) { in mtk_hci_wmt_sync()
194 clear_bit(BTMTKUART_TX_WAIT_VND_EVT, &bdev->tx_state); in mtk_hci_wmt_sync()
200 clear_bit(BTMTKUART_TX_WAIT_VND_EVT, &bdev->tx_state); in mtk_hci_wmt_sync()
201 err = -ETIMEDOUT; in mtk_hci_wmt_sync()
206 wmt_evt = (struct btmtk_hci_wmt_evt *)bdev->evt_skb->data; in mtk_hci_wmt_sync()
207 if (wmt_evt->whdr.op != hdr->op) { in mtk_hci_wmt_sync()
209 wmt_evt->whdr.op, hdr->op); in mtk_hci_wmt_sync()
210 err = -EIO; in mtk_hci_wmt_sync()
214 switch (wmt_evt->whdr.op) { in mtk_hci_wmt_sync()
216 if (wmt_evt->whdr.flag == 2) in mtk_hci_wmt_sync()
223 if (be16_to_cpu(wmt_evt_funcc->status) == 0x404) in mtk_hci_wmt_sync()
225 else if (be16_to_cpu(wmt_evt_funcc->status) == 0x420) in mtk_hci_wmt_sync()
232 if (wmt_params->status) in mtk_hci_wmt_sync()
233 *wmt_params->status = status; in mtk_hci_wmt_sync()
236 kfree_skb(bdev->evt_skb); in mtk_hci_wmt_sync()
237 bdev->evt_skb = NULL; in mtk_hci_wmt_sync()
251 err = request_firmware(&fw, fwname, &hdev->dev); in mtk_setup_firmware()
257 fw_ptr = fw->data; in mtk_setup_firmware()
258 fw_size = fw->size; in mtk_setup_firmware()
262 err = -EINVAL; in mtk_setup_firmware()
266 fw_size -= 30; in mtk_setup_firmware()
277 if (fw_size - dlen <= 0) in mtk_setup_firmware()
279 else if (fw_size < fw->size - 30) in mtk_setup_firmware()
293 fw_size -= dlen; in mtk_setup_firmware()
321 struct hci_event_hdr *hdr = (void *)skb->data; in btmtkuart_recv_event()
328 if (hdr->evt == 0xe4) in btmtkuart_recv_event()
329 hdr->evt = HCI_EV_VENDOR; in btmtkuart_recv_event()
334 if (test_bit(BTMTKUART_TX_WAIT_VND_EVT, &bdev->tx_state)) { in btmtkuart_recv_event()
335 bdev->evt_skb = skb_clone(skb, GFP_KERNEL); in btmtkuart_recv_event()
336 if (!bdev->evt_skb) { in btmtkuart_recv_event()
337 err = -ENOMEM; in btmtkuart_recv_event()
346 if (hdr->evt == HCI_EV_VENDOR) { in btmtkuart_recv_event()
348 &bdev->tx_state)) { in btmtkuart_recv_event()
351 wake_up_bit(&bdev->tx_state, BTMTKUART_TX_WAIT_VND_EVT); in btmtkuart_recv_event()
358 kfree_skb(bdev->evt_skb); in btmtkuart_recv_event()
359 bdev->evt_skb = NULL; in btmtkuart_recv_event()
375 struct serdev_device *serdev = bdev->serdev; in btmtkuart_tx_work()
376 struct hci_dev *hdev = bdev->hdev; in btmtkuart_tx_work()
379 clear_bit(BTMTKUART_TX_STATE_WAKEUP, &bdev->tx_state); in btmtkuart_tx_work()
382 struct sk_buff *skb = skb_dequeue(&bdev->txq); in btmtkuart_tx_work()
388 len = serdev_device_write_buf(serdev, skb->data, in btmtkuart_tx_work()
389 skb->len); in btmtkuart_tx_work()
390 hdev->stat.byte_tx += len; in btmtkuart_tx_work()
393 if (skb->len > 0) { in btmtkuart_tx_work()
394 skb_queue_head(&bdev->txq, skb); in btmtkuart_tx_work()
400 hdev->stat.cmd_tx++; in btmtkuart_tx_work()
403 hdev->stat.acl_tx++; in btmtkuart_tx_work()
406 hdev->stat.sco_tx++; in btmtkuart_tx_work()
413 if (!test_bit(BTMTKUART_TX_STATE_WAKEUP, &bdev->tx_state)) in btmtkuart_tx_work()
417 clear_bit(BTMTKUART_TX_STATE_ACTIVE, &bdev->tx_state); in btmtkuart_tx_work()
422 if (test_and_set_bit(BTMTKUART_TX_STATE_ACTIVE, &bdev->tx_state)) in btmtkuart_tx_wakeup()
423 set_bit(BTMTKUART_TX_STATE_WAKEUP, &bdev->tx_state); in btmtkuart_tx_wakeup()
425 schedule_work(&bdev->tx_work); in btmtkuart_tx_wakeup()
435 if (!bdev->stp_dlen && bdev->stp_cursor >= 6) in mtk_stp_split()
436 bdev->stp_cursor = 0; in mtk_stp_split()
439 while (bdev->stp_cursor < 6 && count > 0) { in mtk_stp_split()
440 bdev->stp_pad[bdev->stp_cursor] = *data; in mtk_stp_split()
441 bdev->stp_cursor++; in mtk_stp_split()
443 count--; in mtk_stp_split()
447 if (!bdev->stp_dlen && bdev->stp_cursor >= 6) { in mtk_stp_split()
448 shdr = (struct mtk_stp_hdr *)&bdev->stp_pad[2]; in mtk_stp_split()
449 bdev->stp_dlen = be16_to_cpu(shdr->dlen) & 0x0fff; in mtk_stp_split()
452 if (shdr->prefix != 0x80 || bdev->stp_dlen > 2048) { in mtk_stp_split()
453 bt_dev_err(bdev->hdev, "stp format unexpect (%d, %d)", in mtk_stp_split()
454 shdr->prefix, bdev->stp_dlen); in mtk_stp_split()
455 bdev->stp_cursor = 2; in mtk_stp_split()
456 bdev->stp_dlen = 0; in mtk_stp_split()
465 *sz_h4 = min_t(int, count, bdev->stp_dlen); in mtk_stp_split()
468 bdev->stp_dlen -= *sz_h4; in mtk_stp_split()
482 /* The serial data received from MT7622 BT controller is in btmtkuart_recv()
486 * ----------------------------------- in btmtkuart_recv()
488 * ----------------------------------- in btmtkuart_recv()
501 adv = p_h4 - p_left; in btmtkuart_recv()
502 sz_left -= adv; in btmtkuart_recv()
505 bdev->rx_skb = h4_recv_buf(bdev->hdev, bdev->rx_skb, p_h4, in btmtkuart_recv()
508 if (IS_ERR(bdev->rx_skb)) { in btmtkuart_recv()
509 err = PTR_ERR(bdev->rx_skb); in btmtkuart_recv()
510 bt_dev_err(bdev->hdev, in btmtkuart_recv()
512 bdev->rx_skb = NULL; in btmtkuart_recv()
516 sz_left -= sz_h4; in btmtkuart_recv()
526 btmtkuart_recv(bdev->hdev, data, count); in btmtkuart_receive_buf()
528 bdev->hdev->stat.byte_rx += count; in btmtkuart_receive_buf()
551 err = serdev_device_open(bdev->serdev); in btmtkuart_open()
554 dev_name(&bdev->serdev->dev)); in btmtkuart_open()
559 if (bdev->curr_speed != bdev->desired_speed) in btmtkuart_open()
560 err = serdev_device_set_baudrate(bdev->serdev, in btmtkuart_open()
563 err = serdev_device_set_baudrate(bdev->serdev, in btmtkuart_open()
564 bdev->desired_speed); in btmtkuart_open()
568 dev_name(&bdev->serdev->dev)); in btmtkuart_open()
572 serdev_device_set_flow_control(bdev->serdev, false); in btmtkuart_open()
575 bdev->stp_cursor = 2; in btmtkuart_open()
576 bdev->stp_dlen = 0; in btmtkuart_open()
578 dev = &bdev->serdev->dev; in btmtkuart_open()
588 err = clk_prepare_enable(bdev->clk); in btmtkuart_open()
599 serdev_device_close(bdev->serdev); in btmtkuart_open()
607 struct device *dev = &bdev->serdev->dev; in btmtkuart_close()
610 clk_disable_unprepare(bdev->clk); in btmtkuart_close()
614 serdev_device_close(bdev->serdev); in btmtkuart_close()
624 serdev_device_write_flush(bdev->serdev); in btmtkuart_flush()
625 skb_queue_purge(&bdev->txq); in btmtkuart_flush()
627 cancel_work_sync(&bdev->tx_work); in btmtkuart_flush()
629 kfree_skb(bdev->rx_skb); in btmtkuart_flush()
630 bdev->rx_skb = NULL; in btmtkuart_flush()
632 bdev->stp_cursor = 2; in btmtkuart_flush()
633 bdev->stp_dlen = 0; in btmtkuart_flush()
671 baudrate = cpu_to_le32(bdev->desired_speed); in btmtkuart_change_baudrate()
684 err = serdev_device_set_baudrate(bdev->serdev, in btmtkuart_change_baudrate()
685 bdev->desired_speed); in btmtkuart_change_baudrate()
692 serdev_device_set_flow_control(bdev->serdev, false); in btmtkuart_change_baudrate()
696 err = serdev_device_write_buf(bdev->serdev, ¶m, sizeof(param)); in btmtkuart_change_baudrate()
700 serdev_device_wait_until_sent(bdev->serdev, 0); in btmtkuart_change_baudrate()
719 bdev->curr_speed = bdev->desired_speed; in btmtkuart_change_baudrate()
740 if (test_bit(BTMTKUART_REQUIRED_WAKEUP, &bdev->tx_state)) { in btmtkuart_setup()
753 clear_bit(BTMTKUART_REQUIRED_WAKEUP, &bdev->tx_state); in btmtkuart_setup()
778 err = mtk_setup_firmware(hdev, bdev->data->fwname); in btmtkuart_setup()
787 /* -ETIMEDOUT happens */ in btmtkuart_setup()
814 /* Apply the low power environment setup */ in btmtkuart_setup()
825 bt_dev_err(hdev, "Failed to apply low power setting (%d)", err); in btmtkuart_setup()
880 dlen = skb->len; in btmtkuart_send_frame()
882 shdr->prefix = 0x80; in btmtkuart_send_frame()
883 shdr->dlen = cpu_to_be16((dlen & 0x0fff) | (type << 12)); in btmtkuart_send_frame()
884 shdr->cs = 0; /* MT7622 doesn't care about checksum value */ in btmtkuart_send_frame()
889 skb_queue_tail(&bdev->txq, skb); in btmtkuart_send_frame()
898 struct device_node *node = serdev->dev.of_node; in btmtkuart_parse_dt()
903 of_property_read_u32(node, "current-speed", &speed); in btmtkuart_parse_dt()
905 bdev->desired_speed = speed; in btmtkuart_parse_dt()
907 bdev->vcc = devm_regulator_get(&serdev->dev, "vcc"); in btmtkuart_parse_dt()
908 if (IS_ERR(bdev->vcc)) { in btmtkuart_parse_dt()
909 err = PTR_ERR(bdev->vcc); in btmtkuart_parse_dt()
913 bdev->osc = devm_clk_get_optional(&serdev->dev, "osc"); in btmtkuart_parse_dt()
914 if (IS_ERR(bdev->osc)) { in btmtkuart_parse_dt()
915 err = PTR_ERR(bdev->osc); in btmtkuart_parse_dt()
919 bdev->boot = devm_gpiod_get_optional(&serdev->dev, "boot", in btmtkuart_parse_dt()
921 if (IS_ERR(bdev->boot)) { in btmtkuart_parse_dt()
922 err = PTR_ERR(bdev->boot); in btmtkuart_parse_dt()
926 bdev->pinctrl = devm_pinctrl_get(&serdev->dev); in btmtkuart_parse_dt()
927 if (IS_ERR(bdev->pinctrl)) { in btmtkuart_parse_dt()
928 err = PTR_ERR(bdev->pinctrl); in btmtkuart_parse_dt()
932 bdev->pins_boot = pinctrl_lookup_state(bdev->pinctrl, in btmtkuart_parse_dt()
934 if (IS_ERR(bdev->pins_boot) && !bdev->boot) { in btmtkuart_parse_dt()
935 err = PTR_ERR(bdev->pins_boot); in btmtkuart_parse_dt()
936 dev_err(&serdev->dev, in btmtkuart_parse_dt()
937 "Should assign RXD to LOW at boot stage\n"); in btmtkuart_parse_dt()
941 bdev->pins_runtime = pinctrl_lookup_state(bdev->pinctrl, in btmtkuart_parse_dt()
943 if (IS_ERR(bdev->pins_runtime)) { in btmtkuart_parse_dt()
944 err = PTR_ERR(bdev->pins_runtime); in btmtkuart_parse_dt()
948 bdev->reset = devm_gpiod_get_optional(&serdev->dev, "reset", in btmtkuart_parse_dt()
950 if (IS_ERR(bdev->reset)) { in btmtkuart_parse_dt()
951 err = PTR_ERR(bdev->reset); in btmtkuart_parse_dt()
955 bdev->clk = devm_clk_get(&serdev->dev, "ref"); in btmtkuart_parse_dt()
956 if (IS_ERR(bdev->clk)) in btmtkuart_parse_dt()
957 return PTR_ERR(bdev->clk); in btmtkuart_parse_dt()
969 bdev = devm_kzalloc(&serdev->dev, sizeof(*bdev), GFP_KERNEL); in btmtkuart_probe()
971 return -ENOMEM; in btmtkuart_probe()
973 bdev->data = of_device_get_match_data(&serdev->dev); in btmtkuart_probe()
974 if (!bdev->data) in btmtkuart_probe()
975 return -ENODEV; in btmtkuart_probe()
977 bdev->serdev = serdev; in btmtkuart_probe()
986 INIT_WORK(&bdev->tx_work, btmtkuart_tx_work); in btmtkuart_probe()
987 skb_queue_head_init(&bdev->txq); in btmtkuart_probe()
992 dev_err(&serdev->dev, "Can't allocate HCI device\n"); in btmtkuart_probe()
993 return -ENOMEM; in btmtkuart_probe()
996 bdev->hdev = hdev; in btmtkuart_probe()
998 hdev->bus = HCI_UART; in btmtkuart_probe()
1001 hdev->open = btmtkuart_open; in btmtkuart_probe()
1002 hdev->close = btmtkuart_close; in btmtkuart_probe()
1003 hdev->flush = btmtkuart_flush; in btmtkuart_probe()
1004 hdev->setup = btmtkuart_setup; in btmtkuart_probe()
1005 hdev->shutdown = btmtkuart_shutdown; in btmtkuart_probe()
1006 hdev->send = btmtkuart_send_frame; in btmtkuart_probe()
1007 SET_HCIDEV_DEV(hdev, &serdev->dev); in btmtkuart_probe()
1009 hdev->manufacturer = 70; in btmtkuart_probe()
1010 set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks); in btmtkuart_probe()
1013 err = clk_prepare_enable(bdev->osc); in btmtkuart_probe()
1017 if (bdev->boot) { in btmtkuart_probe()
1018 gpiod_set_value_cansleep(bdev->boot, 1); in btmtkuart_probe()
1023 pinctrl_select_state(bdev->pinctrl, bdev->pins_boot); in btmtkuart_probe()
1027 err = regulator_enable(bdev->vcc); in btmtkuart_probe()
1031 /* Reset if the reset-gpios is available otherwise the board in btmtkuart_probe()
1032 * -level design should be guaranteed. in btmtkuart_probe()
1034 if (bdev->reset) { in btmtkuart_probe()
1035 gpiod_set_value_cansleep(bdev->reset, 1); in btmtkuart_probe()
1037 gpiod_set_value_cansleep(bdev->reset, 0); in btmtkuart_probe()
1045 if (bdev->boot) in btmtkuart_probe()
1046 devm_gpiod_put(&serdev->dev, bdev->boot); in btmtkuart_probe()
1048 pinctrl_select_state(bdev->pinctrl, bdev->pins_runtime); in btmtkuart_probe()
1053 pm_runtime_no_callbacks(&serdev->dev); in btmtkuart_probe()
1055 set_bit(BTMTKUART_REQUIRED_WAKEUP, &bdev->tx_state); in btmtkuart_probe()
1060 dev_err(&serdev->dev, "Can't register HCI device\n"); in btmtkuart_probe()
1068 regulator_disable(bdev->vcc); in btmtkuart_probe()
1071 clk_disable_unprepare(bdev->osc); in btmtkuart_probe()
1081 struct hci_dev *hdev = bdev->hdev; in btmtkuart_remove()
1084 regulator_disable(bdev->vcc); in btmtkuart_remove()
1085 clk_disable_unprepare(bdev->osc); in btmtkuart_remove()
1108 { .compatible = "mediatek,mt7622-bluetooth", .data = &mt7622_data},
1109 { .compatible = "mediatek,mt7663u-bluetooth", .data = &mt7663_data},
1110 { .compatible = "mediatek,mt7668u-bluetooth", .data = &mt7668_data},
1128 MODULE_DESCRIPTION("MediaTek Bluetooth Serial driver ver " VERSION);