Lines Matching +full:swctrl +full:- +full:gpios

1 // SPDX-License-Identifier: GPL-2.0-only
5 * HCI_IBS (HCI In-Band Sleep) is Qualcomm's power management
13 * Written by Ohad Ben-Cohen <[email protected]>
246 if (hu->serdev) { in qca_soc_type()
247 struct qca_serdev *qsd = serdev_device_get_drvdata(hu->serdev); in qca_soc_type()
249 soc_type = qsd->btsoc_type; in qca_soc_type()
259 if (hu->serdev) { in qca_get_firmware_name()
260 struct qca_serdev *qsd = serdev_device_get_drvdata(hu->serdev); in qca_get_firmware_name()
262 return qsd->firmware_name[0]; in qca_get_firmware_name()
270 if (hu->serdev) { in qca_get_rampatch_name()
271 struct qca_serdev *qsd = serdev_device_get_drvdata(hu->serdev); in qca_get_rampatch_name()
273 return qsd->firmware_name[1]; in qca_get_rampatch_name()
298 struct qca_data *qca = hu->priv; in serial_clock_vote()
301 bool old_vote = (qca->tx_vote | qca->rx_vote); in serial_clock_vote()
306 diff = jiffies_to_msecs(jiffies - qca->vote_last_jif); in serial_clock_vote()
309 qca->vote_off_ms += diff; in serial_clock_vote()
311 qca->vote_on_ms += diff; in serial_clock_vote()
315 qca->tx_vote = true; in serial_clock_vote()
316 qca->tx_votes_on++; in serial_clock_vote()
320 qca->rx_vote = true; in serial_clock_vote()
321 qca->rx_votes_on++; in serial_clock_vote()
325 qca->tx_vote = false; in serial_clock_vote()
326 qca->tx_votes_off++; in serial_clock_vote()
330 qca->rx_vote = false; in serial_clock_vote()
331 qca->rx_votes_off++; in serial_clock_vote()
339 new_vote = qca->rx_vote | qca->tx_vote; in serial_clock_vote()
343 __serial_clock_on(hu->tty); in serial_clock_vote()
345 __serial_clock_off(hu->tty); in serial_clock_vote()
350 diff = jiffies_to_msecs(jiffies - qca->vote_last_jif); in serial_clock_vote()
353 qca->votes_on++; in serial_clock_vote()
354 qca->vote_off_ms += diff; in serial_clock_vote()
356 qca->votes_off++; in serial_clock_vote()
357 qca->vote_on_ms += diff; in serial_clock_vote()
359 qca->vote_last_jif = jiffies; in serial_clock_vote()
370 struct qca_data *qca = hu->priv; in send_hci_ibs_cmd()
377 return -ENOMEM; in send_hci_ibs_cmd()
383 skb_queue_tail(&qca->txq, skb); in send_hci_ibs_cmd()
392 struct hci_uart *hu = qca->hu; in qca_wq_awake_device()
401 spin_lock_irqsave(&qca->hci_ibs_lock, flags); in qca_wq_awake_device()
407 qca->ibs_sent_wakes++; in qca_wq_awake_device()
410 retrans_delay = msecs_to_jiffies(qca->wake_retrans); in qca_wq_awake_device()
411 mod_timer(&qca->wake_retrans_timer, jiffies + retrans_delay); in qca_wq_awake_device()
413 spin_unlock_irqrestore(&qca->hci_ibs_lock, flags); in qca_wq_awake_device()
423 struct hci_uart *hu = qca->hu; in qca_wq_awake_rx()
430 spin_lock_irqsave(&qca->hci_ibs_lock, flags); in qca_wq_awake_rx()
431 qca->rx_ibs_state = HCI_IBS_RX_AWAKE; in qca_wq_awake_rx()
439 qca->ibs_sent_wacks++; in qca_wq_awake_rx()
441 spin_unlock_irqrestore(&qca->hci_ibs_lock, flags); in qca_wq_awake_rx()
451 struct hci_uart *hu = qca->hu; in qca_wq_serial_rx_clock_vote_off()
462 struct hci_uart *hu = qca->hu; in qca_wq_serial_tx_clock_vote_off()
478 struct hci_uart *hu = qca->hu; in hci_ibs_tx_idle_timeout()
481 BT_DBG("hu %p idle timeout in %d state", hu, qca->tx_ibs_state); in hci_ibs_tx_idle_timeout()
483 spin_lock_irqsave_nested(&qca->hci_ibs_lock, in hci_ibs_tx_idle_timeout()
486 switch (qca->tx_ibs_state) { in hci_ibs_tx_idle_timeout()
493 qca->tx_ibs_state = HCI_IBS_TX_ASLEEP; in hci_ibs_tx_idle_timeout()
494 qca->ibs_sent_slps++; in hci_ibs_tx_idle_timeout()
495 queue_work(qca->workqueue, &qca->ws_tx_vote_off); in hci_ibs_tx_idle_timeout()
501 BT_ERR("Spurious timeout tx state %d", qca->tx_ibs_state); in hci_ibs_tx_idle_timeout()
505 spin_unlock_irqrestore(&qca->hci_ibs_lock, flags); in hci_ibs_tx_idle_timeout()
511 struct hci_uart *hu = qca->hu; in hci_ibs_wake_retrans_timeout()
516 hu, qca->tx_ibs_state); in hci_ibs_wake_retrans_timeout()
518 spin_lock_irqsave_nested(&qca->hci_ibs_lock, in hci_ibs_wake_retrans_timeout()
522 if (test_bit(QCA_SUSPENDING, &qca->flags)) { in hci_ibs_wake_retrans_timeout()
523 spin_unlock_irqrestore(&qca->hci_ibs_lock, flags); in hci_ibs_wake_retrans_timeout()
527 switch (qca->tx_ibs_state) { in hci_ibs_wake_retrans_timeout()
535 qca->ibs_sent_wakes++; in hci_ibs_wake_retrans_timeout()
536 retrans_delay = msecs_to_jiffies(qca->wake_retrans); in hci_ibs_wake_retrans_timeout()
537 mod_timer(&qca->wake_retrans_timer, jiffies + retrans_delay); in hci_ibs_wake_retrans_timeout()
543 BT_ERR("Spurious timeout tx state %d", qca->tx_ibs_state); in hci_ibs_wake_retrans_timeout()
547 spin_unlock_irqrestore(&qca->hci_ibs_lock, flags); in hci_ibs_wake_retrans_timeout()
558 struct hci_uart *hu = qca->hu; in qca_controller_memdump_timeout()
560 mutex_lock(&qca->hci_memdump_lock); in qca_controller_memdump_timeout()
561 if (test_bit(QCA_MEMDUMP_COLLECTION, &qca->flags)) { in qca_controller_memdump_timeout()
562 qca->memdump_state = QCA_MEMDUMP_TIMEOUT; in qca_controller_memdump_timeout()
563 if (!test_bit(QCA_HW_ERROR_EVENT, &qca->flags)) { in qca_controller_memdump_timeout()
567 hci_reset_dev(hu->hdev); in qca_controller_memdump_timeout()
571 mutex_unlock(&qca->hci_memdump_lock); in qca_controller_memdump_timeout()
584 return -EOPNOTSUPP; in qca_open()
588 return -ENOMEM; in qca_open()
590 skb_queue_head_init(&qca->txq); in qca_open()
591 skb_queue_head_init(&qca->tx_wait_q); in qca_open()
592 skb_queue_head_init(&qca->rx_memdump_q); in qca_open()
593 spin_lock_init(&qca->hci_ibs_lock); in qca_open()
594 mutex_init(&qca->hci_memdump_lock); in qca_open()
595 qca->workqueue = alloc_ordered_workqueue("qca_wq", 0); in qca_open()
596 if (!qca->workqueue) { in qca_open()
599 return -ENOMEM; in qca_open()
602 INIT_WORK(&qca->ws_awake_rx, qca_wq_awake_rx); in qca_open()
603 INIT_WORK(&qca->ws_awake_device, qca_wq_awake_device); in qca_open()
604 INIT_WORK(&qca->ws_rx_vote_off, qca_wq_serial_rx_clock_vote_off); in qca_open()
605 INIT_WORK(&qca->ws_tx_vote_off, qca_wq_serial_tx_clock_vote_off); in qca_open()
606 INIT_WORK(&qca->ctrl_memdump_evt, qca_controller_memdump); in qca_open()
607 INIT_DELAYED_WORK(&qca->ctrl_memdump_timeout, in qca_open()
609 init_waitqueue_head(&qca->suspend_wait_q); in qca_open()
611 qca->hu = hu; in qca_open()
612 init_completion(&qca->drop_ev_comp); in qca_open()
614 /* Assume we start with both sides asleep -- extra wakes OK */ in qca_open()
615 qca->tx_ibs_state = HCI_IBS_TX_ASLEEP; in qca_open()
616 qca->rx_ibs_state = HCI_IBS_RX_ASLEEP; in qca_open()
618 qca->vote_last_jif = jiffies; in qca_open()
620 hu->priv = qca; in qca_open()
622 if (hu->serdev) { in qca_open()
623 qcadev = serdev_device_get_drvdata(hu->serdev); in qca_open()
625 switch (qcadev->btsoc_type) { in qca_open()
632 hu->init_speed = qcadev->init_speed; in qca_open()
639 if (qcadev->oper_speed) in qca_open()
640 hu->oper_speed = qcadev->oper_speed; in qca_open()
643 timer_setup(&qca->wake_retrans_timer, hci_ibs_wake_retrans_timeout, 0); in qca_open()
644 qca->wake_retrans = IBS_WAKE_RETRANS_TIMEOUT_MS; in qca_open()
646 timer_setup(&qca->tx_idle_timer, hci_ibs_tx_idle_timeout, 0); in qca_open()
647 qca->tx_idle_delay = IBS_HOST_TX_IDLE_TIMEOUT_MS; in qca_open()
650 qca->tx_idle_delay, qca->wake_retrans); in qca_open()
658 struct qca_data *qca = hu->priv; in qca_debugfs_init()
662 if (!hdev->debugfs) in qca_debugfs_init()
665 if (test_and_set_bit(QCA_DEBUGFS_CREATED, &qca->flags)) in qca_debugfs_init()
668 ibs_dir = debugfs_create_dir("ibs", hdev->debugfs); in qca_debugfs_init()
672 debugfs_create_u8("tx_ibs_state", mode, ibs_dir, &qca->tx_ibs_state); in qca_debugfs_init()
673 debugfs_create_u8("rx_ibs_state", mode, ibs_dir, &qca->rx_ibs_state); in qca_debugfs_init()
675 &qca->ibs_sent_slps); in qca_debugfs_init()
677 &qca->ibs_sent_wakes); in qca_debugfs_init()
679 &qca->ibs_sent_wacks); in qca_debugfs_init()
681 &qca->ibs_recv_slps); in qca_debugfs_init()
683 &qca->ibs_recv_wakes); in qca_debugfs_init()
685 &qca->ibs_recv_wacks); in qca_debugfs_init()
686 debugfs_create_bool("tx_vote", mode, ibs_dir, &qca->tx_vote); in qca_debugfs_init()
687 debugfs_create_u64("tx_votes_on", mode, ibs_dir, &qca->tx_votes_on); in qca_debugfs_init()
688 debugfs_create_u64("tx_votes_off", mode, ibs_dir, &qca->tx_votes_off); in qca_debugfs_init()
689 debugfs_create_bool("rx_vote", mode, ibs_dir, &qca->rx_vote); in qca_debugfs_init()
690 debugfs_create_u64("rx_votes_on", mode, ibs_dir, &qca->rx_votes_on); in qca_debugfs_init()
691 debugfs_create_u64("rx_votes_off", mode, ibs_dir, &qca->rx_votes_off); in qca_debugfs_init()
692 debugfs_create_u64("votes_on", mode, ibs_dir, &qca->votes_on); in qca_debugfs_init()
693 debugfs_create_u64("votes_off", mode, ibs_dir, &qca->votes_off); in qca_debugfs_init()
694 debugfs_create_u32("vote_on_ms", mode, ibs_dir, &qca->vote_on_ms); in qca_debugfs_init()
695 debugfs_create_u32("vote_off_ms", mode, ibs_dir, &qca->vote_off_ms); in qca_debugfs_init()
699 debugfs_create_u32("wake_retrans", mode, ibs_dir, &qca->wake_retrans); in qca_debugfs_init()
701 &qca->tx_idle_delay); in qca_debugfs_init()
707 struct qca_data *qca = hu->priv; in qca_flush()
711 skb_queue_purge(&qca->tx_wait_q); in qca_flush()
712 skb_queue_purge(&qca->txq); in qca_flush()
720 struct qca_data *qca = hu->priv; in qca_close()
726 skb_queue_purge(&qca->tx_wait_q); in qca_close()
727 skb_queue_purge(&qca->txq); in qca_close()
728 skb_queue_purge(&qca->rx_memdump_q); in qca_close()
735 timer_shutdown_sync(&qca->tx_idle_timer); in qca_close()
736 timer_shutdown_sync(&qca->wake_retrans_timer); in qca_close()
737 destroy_workqueue(qca->workqueue); in qca_close()
738 qca->hu = NULL; in qca_close()
740 kfree_skb(qca->rx_skb); in qca_close()
742 hu->priv = NULL; in qca_close()
749 /* Called upon a wake-up-indication from the device.
754 struct qca_data *qca = hu->priv; in device_want_to_wakeup()
758 spin_lock_irqsave(&qca->hci_ibs_lock, flags); in device_want_to_wakeup()
760 qca->ibs_recv_wakes++; in device_want_to_wakeup()
763 if (test_bit(QCA_SUSPENDING, &qca->flags)) { in device_want_to_wakeup()
764 spin_unlock_irqrestore(&qca->hci_ibs_lock, flags); in device_want_to_wakeup()
768 switch (qca->rx_ibs_state) { in device_want_to_wakeup()
770 /* Make sure clock is on - we may have turned clock off since in device_want_to_wakeup()
773 queue_work(qca->workqueue, &qca->ws_awake_rx); in device_want_to_wakeup()
774 spin_unlock_irqrestore(&qca->hci_ibs_lock, flags); in device_want_to_wakeup()
785 qca->ibs_sent_wacks++; in device_want_to_wakeup()
791 qca->rx_ibs_state); in device_want_to_wakeup()
795 spin_unlock_irqrestore(&qca->hci_ibs_lock, flags); in device_want_to_wakeup()
801 /* Called upon a sleep-indication from the device.
806 struct qca_data *qca = hu->priv; in device_want_to_sleep()
808 BT_DBG("hu %p want to sleep in %d state", hu, qca->rx_ibs_state); in device_want_to_sleep()
810 spin_lock_irqsave(&qca->hci_ibs_lock, flags); in device_want_to_sleep()
812 qca->ibs_recv_slps++; in device_want_to_sleep()
814 switch (qca->rx_ibs_state) { in device_want_to_sleep()
817 qca->rx_ibs_state = HCI_IBS_RX_ASLEEP; in device_want_to_sleep()
819 queue_work(qca->workqueue, &qca->ws_rx_vote_off); in device_want_to_sleep()
828 qca->rx_ibs_state); in device_want_to_sleep()
832 wake_up_interruptible(&qca->suspend_wait_q); in device_want_to_sleep()
834 spin_unlock_irqrestore(&qca->hci_ibs_lock, flags); in device_want_to_sleep()
837 /* Called upon wake-up-acknowledgement from the device
842 struct qca_data *qca = hu->priv; in device_woke_up()
847 spin_lock_irqsave(&qca->hci_ibs_lock, flags); in device_woke_up()
849 qca->ibs_recv_wacks++; in device_woke_up()
851 /* Don't react to the wake-up-acknowledgment when suspending. */ in device_woke_up()
852 if (test_bit(QCA_SUSPENDING, &qca->flags)) { in device_woke_up()
853 spin_unlock_irqrestore(&qca->hci_ibs_lock, flags); in device_woke_up()
857 switch (qca->tx_ibs_state) { in device_woke_up()
861 qca->tx_ibs_state); in device_woke_up()
866 while ((skb = skb_dequeue(&qca->tx_wait_q))) in device_woke_up()
867 skb_queue_tail(&qca->txq, skb); in device_woke_up()
870 del_timer(&qca->wake_retrans_timer); in device_woke_up()
871 idle_delay = msecs_to_jiffies(qca->tx_idle_delay); in device_woke_up()
872 mod_timer(&qca->tx_idle_timer, jiffies + idle_delay); in device_woke_up()
873 qca->tx_ibs_state = HCI_IBS_TX_AWAKE; in device_woke_up()
879 qca->tx_ibs_state); in device_woke_up()
883 spin_unlock_irqrestore(&qca->hci_ibs_lock, flags); in device_woke_up()
895 struct qca_data *qca = hu->priv; in qca_enqueue()
898 qca->tx_ibs_state); in qca_enqueue()
900 if (test_bit(QCA_SSR_TRIGGERED, &qca->flags)) { in qca_enqueue()
902 bt_dev_dbg(hu->hdev, "SSR is in progress"); in qca_enqueue()
910 spin_lock_irqsave(&qca->hci_ibs_lock, flags); in qca_enqueue()
913 * Out-Of-Band(GPIOs control) sleep is selected. in qca_enqueue()
916 if (test_bit(QCA_IBS_DISABLED, &qca->flags) || in qca_enqueue()
917 test_bit(QCA_SUSPENDING, &qca->flags)) { in qca_enqueue()
918 skb_queue_tail(&qca->txq, skb); in qca_enqueue()
919 spin_unlock_irqrestore(&qca->hci_ibs_lock, flags); in qca_enqueue()
924 switch (qca->tx_ibs_state) { in qca_enqueue()
927 skb_queue_tail(&qca->txq, skb); in qca_enqueue()
928 idle_delay = msecs_to_jiffies(qca->tx_idle_delay); in qca_enqueue()
929 mod_timer(&qca->tx_idle_timer, jiffies + idle_delay); in qca_enqueue()
935 skb_queue_tail(&qca->tx_wait_q, skb); in qca_enqueue()
937 qca->tx_ibs_state = HCI_IBS_TX_WAKING; in qca_enqueue()
939 queue_work(qca->workqueue, &qca->ws_awake_device); in qca_enqueue()
945 skb_queue_tail(&qca->tx_wait_q, skb); in qca_enqueue()
950 qca->tx_ibs_state); in qca_enqueue()
955 spin_unlock_irqrestore(&qca->hci_ibs_lock, flags); in qca_enqueue()
1003 if (get_unaligned_le16(skb->data) == QCA_DEBUG_HANDLE) in qca_recv_acl_data()
1012 struct qca_data *qca = hu->priv; in qca_dmp_hdr()
1016 qca->controller_id); in qca_dmp_hdr()
1020 qca->fw_version); in qca_dmp_hdr()
1027 hu->serdev->dev.driver->name); in qca_dmp_hdr()
1035 struct hci_uart *hu = qca->hu; in qca_controller_memdump()
1038 struct qca_memdump_info *qca_memdump = qca->qca_memdump; in qca_controller_memdump()
1045 while ((skb = skb_dequeue(&qca->rx_memdump_q))) { in qca_controller_memdump()
1047 mutex_lock(&qca->hci_memdump_lock); in qca_controller_memdump()
1051 if (qca->memdump_state == QCA_MEMDUMP_TIMEOUT || in qca_controller_memdump()
1052 qca->memdump_state == QCA_MEMDUMP_COLLECTED) { in qca_controller_memdump()
1053 mutex_unlock(&qca->hci_memdump_lock); in qca_controller_memdump()
1060 mutex_unlock(&qca->hci_memdump_lock); in qca_controller_memdump()
1064 qca->qca_memdump = qca_memdump; in qca_controller_memdump()
1067 qca->memdump_state = QCA_MEMDUMP_COLLECTING; in qca_controller_memdump()
1068 cmd_hdr = (void *) skb->data; in qca_controller_memdump()
1069 seq_no = __le16_to_cpu(cmd_hdr->seq_no); in qca_controller_memdump()
1080 set_bit(QCA_IBS_DISABLED, &qca->flags); in qca_controller_memdump()
1081 set_bit(QCA_MEMDUMP_COLLECTION, &qca->flags); in qca_controller_memdump()
1082 dump = (void *) skb->data; in qca_controller_memdump()
1083 qca_memdump->ram_dump_size = __le32_to_cpu(dump->dump_size); in qca_controller_memdump()
1084 if (!(qca_memdump->ram_dump_size)) { in qca_controller_memdump()
1085 bt_dev_err(hu->hdev, "Rx invalid memdump size"); in qca_controller_memdump()
1088 mutex_unlock(&qca->hci_memdump_lock); in qca_controller_memdump()
1092 queue_delayed_work(qca->workqueue, in qca_controller_memdump()
1093 &qca->ctrl_memdump_timeout, in qca_controller_memdump()
1095 skb_pull(skb, sizeof(qca_memdump->ram_dump_size)); in qca_controller_memdump()
1096 qca_memdump->current_seq_no = 0; in qca_controller_memdump()
1097 qca_memdump->received_dump = 0; in qca_controller_memdump()
1098 ret = hci_devcd_init(hu->hdev, qca_memdump->ram_dump_size); in qca_controller_memdump()
1099 bt_dev_info(hu->hdev, "hci_devcd_init Return:%d", in qca_controller_memdump()
1102 kfree(qca->qca_memdump); in qca_controller_memdump()
1103 qca->qca_memdump = NULL; in qca_controller_memdump()
1104 qca->memdump_state = QCA_MEMDUMP_COLLECTED; in qca_controller_memdump()
1105 cancel_delayed_work(&qca->ctrl_memdump_timeout); in qca_controller_memdump()
1106 clear_bit(QCA_MEMDUMP_COLLECTION, &qca->flags); in qca_controller_memdump()
1107 clear_bit(QCA_IBS_DISABLED, &qca->flags); in qca_controller_memdump()
1108 mutex_unlock(&qca->hci_memdump_lock); in qca_controller_memdump()
1112 bt_dev_info(hu->hdev, "QCA collecting dump of size:%u", in qca_controller_memdump()
1113 qca_memdump->ram_dump_size); in qca_controller_memdump()
1120 if (!test_bit(QCA_MEMDUMP_COLLECTION, &qca->flags)) { in qca_controller_memdump()
1121 bt_dev_err(hu->hdev, "QCA: Discarding other packets"); in qca_controller_memdump()
1124 mutex_unlock(&qca->hci_memdump_lock); in qca_controller_memdump()
1135 while ((seq_no > qca_memdump->current_seq_no + 1) && in qca_controller_memdump()
1138 bt_dev_err(hu->hdev, "QCA controller missed packet:%d", in qca_controller_memdump()
1139 qca_memdump->current_seq_no); in qca_controller_memdump()
1140 rx_size = qca_memdump->received_dump; in qca_controller_memdump()
1142 if (rx_size > qca_memdump->ram_dump_size) { in qca_controller_memdump()
1143 bt_dev_err(hu->hdev, in qca_controller_memdump()
1145 qca_memdump->received_dump); in qca_controller_memdump()
1148 hci_devcd_append_pattern(hu->hdev, 0x00, in qca_controller_memdump()
1150 qca_memdump->received_dump += QCA_DUMP_PACKET_SIZE; in qca_controller_memdump()
1151 qca_memdump->current_seq_no++; in qca_controller_memdump()
1154 rx_size = qca_memdump->received_dump + skb->len; in qca_controller_memdump()
1155 if (rx_size <= qca_memdump->ram_dump_size) { in qca_controller_memdump()
1157 (seq_no != qca_memdump->current_seq_no)) { in qca_controller_memdump()
1158 bt_dev_err(hu->hdev, in qca_controller_memdump()
1162 bt_dev_dbg(hu->hdev, in qca_controller_memdump()
1164 seq_no, skb->len); in qca_controller_memdump()
1165 hci_devcd_append(hu->hdev, skb); in qca_controller_memdump()
1166 qca_memdump->current_seq_no += 1; in qca_controller_memdump()
1167 qca_memdump->received_dump = rx_size; in qca_controller_memdump()
1169 bt_dev_err(hu->hdev, in qca_controller_memdump()
1171 qca_memdump->current_seq_no); in qca_controller_memdump()
1175 bt_dev_info(hu->hdev, in qca_controller_memdump()
1177 qca_memdump->received_dump, in qca_controller_memdump()
1178 qca_memdump->ram_dump_size); in qca_controller_memdump()
1179 hci_devcd_complete(hu->hdev); in qca_controller_memdump()
1180 cancel_delayed_work(&qca->ctrl_memdump_timeout); in qca_controller_memdump()
1181 kfree(qca->qca_memdump); in qca_controller_memdump()
1182 qca->qca_memdump = NULL; in qca_controller_memdump()
1183 qca->memdump_state = QCA_MEMDUMP_COLLECTED; in qca_controller_memdump()
1184 clear_bit(QCA_MEMDUMP_COLLECTION, &qca->flags); in qca_controller_memdump()
1187 mutex_unlock(&qca->hci_memdump_lock); in qca_controller_memdump()
1196 struct qca_data *qca = hu->priv; in qca_controller_memdump_event()
1198 set_bit(QCA_SSR_TRIGGERED, &qca->flags); in qca_controller_memdump_event()
1199 skb_queue_tail(&qca->rx_memdump_q, skb); in qca_controller_memdump_event()
1200 queue_work(qca->workqueue, &qca->ctrl_memdump_evt); in qca_controller_memdump_event()
1208 struct qca_data *qca = hu->priv; in qca_recv_event()
1210 if (test_bit(QCA_DROP_VENDOR_EVENT, &qca->flags)) { in qca_recv_event()
1211 struct hci_event_hdr *hdr = (void *)skb->data; in qca_recv_event()
1223 if (hdr->evt == HCI_EV_VENDOR) in qca_recv_event()
1224 complete(&qca->drop_ev_comp); in qca_recv_event()
1235 if ((skb->data[0] == HCI_VENDOR_PKT) && in qca_recv_event()
1236 (get_unaligned_be16(skb->data + 2) == QCA_SSR_DUMP_HANDLE)) in qca_recv_event()
1274 struct qca_data *qca = hu->priv; in qca_recv()
1276 if (!test_bit(HCI_UART_REGISTERED, &hu->flags)) in qca_recv()
1277 return -EUNATCH; in qca_recv()
1279 qca->rx_skb = h4_recv_buf(hu->hdev, qca->rx_skb, data, count, in qca_recv()
1281 if (IS_ERR(qca->rx_skb)) { in qca_recv()
1282 int err = PTR_ERR(qca->rx_skb); in qca_recv()
1283 bt_dev_err(hu->hdev, "Frame reassembly failed (%d)", err); in qca_recv()
1284 qca->rx_skb = NULL; in qca_recv()
1293 struct qca_data *qca = hu->priv; in qca_dequeue()
1295 return skb_dequeue(&qca->txq); in qca_dequeue()
1337 struct qca_data *qca = hu->priv; in qca_set_baudrate()
1342 return -EINVAL; in qca_set_baudrate()
1349 return -ENOMEM; in qca_set_baudrate()
1356 skb_queue_tail(&qca->txq, skb); in qca_set_baudrate()
1361 while (!skb_queue_empty(&qca->txq)) in qca_set_baudrate()
1364 if (hu->serdev) in qca_set_baudrate()
1365 serdev_device_wait_until_sent(hu->serdev, in qca_set_baudrate()
1390 if (hu->serdev) in host_set_baudrate()
1391 serdev_device_set_baudrate(hu->serdev, speed); in host_set_baudrate()
1405 * For example, wcn3990 supports RF COEX antenna for both Wi-Fi/BT in qca_send_power_pulse()
1407 * Wi-Fi/BT. Powering up the power sources will not enable BT, until in qca_send_power_pulse()
1412 bt_dev_dbg(hu->hdev, "sending power pulse %02x to controller", cmd); in qca_send_power_pulse()
1414 serdev_device_write_flush(hu->serdev); in qca_send_power_pulse()
1416 ret = serdev_device_write_buf(hu->serdev, &cmd, sizeof(cmd)); in qca_send_power_pulse()
1418 bt_dev_err(hu->hdev, "failed to send power pulse %02x", cmd); in qca_send_power_pulse()
1422 serdev_device_wait_until_sent(hu->serdev, timeout); in qca_send_power_pulse()
1440 if (hu->init_speed) in qca_get_speed()
1441 speed = hu->init_speed; in qca_get_speed()
1442 else if (hu->proto->init_speed) in qca_get_speed()
1443 speed = hu->proto->init_speed; in qca_get_speed()
1445 if (hu->oper_speed) in qca_get_speed()
1446 speed = hu->oper_speed; in qca_get_speed()
1447 else if (hu->proto->oper_speed) in qca_get_speed()
1448 speed = hu->proto->oper_speed; in qca_get_speed()
1467 return -EINVAL; in qca_check_speeds()
1473 return -EINVAL; in qca_check_speeds()
1482 struct qca_data *qca = hu->priv; in qca_set_speed()
1517 reinit_completion(&qca->drop_ev_comp); in qca_set_speed()
1518 set_bit(QCA_DROP_VENDOR_EVENT, &qca->flags); in qca_set_speed()
1526 bt_dev_dbg(hu->hdev, "Set UART speed to %d", speed); in qca_set_speed()
1527 ret = qca_set_baudrate(hu->hdev, qca_baudrate); in qca_set_speed()
1555 if (!wait_for_completion_timeout(&qca->drop_ev_comp, in qca_set_speed()
1557 bt_dev_err(hu->hdev, in qca_set_speed()
1559 ret = -ETIMEDOUT; in qca_set_speed()
1562 clear_bit(QCA_DROP_VENDOR_EVENT, &qca->flags); in qca_set_speed()
1575 struct qca_data *qca = hu->priv; in qca_send_crashbuffer()
1580 bt_dev_err(hu->hdev, "Failed to allocate memory for skb packet"); in qca_send_crashbuffer()
1581 return -ENOMEM; in qca_send_crashbuffer()
1591 bt_dev_info(hu->hdev, "crash the soc to collect controller dump"); in qca_send_crashbuffer()
1592 skb_queue_tail(&qca->txq, skb); in qca_send_crashbuffer()
1601 struct qca_data *qca = hu->priv; in qca_wait_for_dump_collection()
1603 wait_on_bit_timeout(&qca->flags, QCA_MEMDUMP_COLLECTION, in qca_wait_for_dump_collection()
1606 clear_bit(QCA_MEMDUMP_COLLECTION, &qca->flags); in qca_wait_for_dump_collection()
1612 struct qca_data *qca = hu->priv; in qca_hw_error()
1614 set_bit(QCA_SSR_TRIGGERED, &qca->flags); in qca_hw_error()
1615 set_bit(QCA_HW_ERROR_EVENT, &qca->flags); in qca_hw_error()
1616 bt_dev_info(hdev, "mem_dump_status: %d", qca->memdump_state); in qca_hw_error()
1618 if (qca->memdump_state == QCA_MEMDUMP_IDLE) { in qca_hw_error()
1625 set_bit(QCA_MEMDUMP_COLLECTION, &qca->flags); in qca_hw_error()
1628 } else if (qca->memdump_state == QCA_MEMDUMP_COLLECTING) { in qca_hw_error()
1636 mutex_lock(&qca->hci_memdump_lock); in qca_hw_error()
1637 if (qca->memdump_state != QCA_MEMDUMP_COLLECTED) { in qca_hw_error()
1638 bt_dev_err(hu->hdev, "clearing allocated memory due to memdump timeout"); in qca_hw_error()
1639 hci_devcd_abort(hu->hdev); in qca_hw_error()
1640 if (qca->qca_memdump) { in qca_hw_error()
1641 kfree(qca->qca_memdump); in qca_hw_error()
1642 qca->qca_memdump = NULL; in qca_hw_error()
1644 qca->memdump_state = QCA_MEMDUMP_TIMEOUT; in qca_hw_error()
1645 cancel_delayed_work(&qca->ctrl_memdump_timeout); in qca_hw_error()
1647 mutex_unlock(&qca->hci_memdump_lock); in qca_hw_error()
1649 if (qca->memdump_state == QCA_MEMDUMP_TIMEOUT || in qca_hw_error()
1650 qca->memdump_state == QCA_MEMDUMP_COLLECTED) { in qca_hw_error()
1651 cancel_work_sync(&qca->ctrl_memdump_evt); in qca_hw_error()
1652 skb_queue_purge(&qca->rx_memdump_q); in qca_hw_error()
1655 clear_bit(QCA_HW_ERROR_EVENT, &qca->flags); in qca_hw_error()
1661 struct qca_data *qca = hu->priv; in qca_reset()
1663 set_bit(QCA_SSR_TRIGGERED, &qca->flags); in qca_reset()
1664 if (qca->memdump_state == QCA_MEMDUMP_IDLE) { in qca_reset()
1665 set_bit(QCA_MEMDUMP_COLLECTION, &qca->flags); in qca_reset()
1668 } else if (qca->memdump_state == QCA_MEMDUMP_COLLECTING) { in qca_reset()
1676 mutex_lock(&qca->hci_memdump_lock); in qca_reset()
1677 if (qca->memdump_state != QCA_MEMDUMP_COLLECTED) { in qca_reset()
1678 qca->memdump_state = QCA_MEMDUMP_TIMEOUT; in qca_reset()
1679 if (!test_bit(QCA_HW_ERROR_EVENT, &qca->flags)) { in qca_reset()
1683 hci_reset_dev(hu->hdev); in qca_reset()
1686 mutex_unlock(&qca->hci_memdump_lock); in qca_reset()
1694 if (!hu->serdev) in qca_wakeup()
1701 wakeup = device_may_wakeup(&hu->serdev->ctrl->dev); in qca_wakeup()
1702 bt_dev_dbg(hu->hdev, "wakeup status : %d", wakeup); in qca_wakeup()
1716 serdev_device_close(hu->serdev); in qca_port_reopen()
1717 ret = serdev_device_open(hu->serdev); in qca_port_reopen()
1719 bt_dev_err(hu->hdev, "failed to open port"); in qca_port_reopen()
1738 qcadev = serdev_device_get_drvdata(hu->serdev); in qca_regulator_init()
1740 if (!qcadev->bt_power->vregs_on) { in qca_regulator_init()
1741 serdev_device_close(hu->serdev); in qca_regulator_init()
1746 ret = serdev_device_open(hu->serdev); in qca_regulator_init()
1748 bt_dev_err(hu->hdev, "failed to open port"); in qca_regulator_init()
1771 if (qcadev->bt_en) { in qca_regulator_init()
1772 gpiod_set_value_cansleep(qcadev->bt_en, 0); in qca_regulator_init()
1774 gpiod_set_value_cansleep(qcadev->bt_en, 1); in qca_regulator_init()
1776 if (qcadev->sw_ctrl) { in qca_regulator_init()
1777 sw_ctrl_state = gpiod_get_value_cansleep(qcadev->sw_ctrl); in qca_regulator_init()
1778 bt_dev_dbg(hu->hdev, "SW_CTRL is %d", sw_ctrl_state); in qca_regulator_init()
1807 struct qca_data *qca = hu->priv; in qca_power_on()
1810 /* Non-serdev device usually is powered by external power in qca_power_on()
1813 if (!hu->serdev) in qca_power_on()
1830 qcadev = serdev_device_get_drvdata(hu->serdev); in qca_power_on()
1831 if (qcadev->bt_en) { in qca_power_on()
1832 gpiod_set_value_cansleep(qcadev->bt_en, 1); in qca_power_on()
1838 clear_bit(QCA_BT_OFF, &qca->flags); in qca_power_on()
1854 /* QCA uses 1 as non-HCI data path id for HFP */ in qca_get_data_path_id()
1861 bt_dev_info(hdev, "HFP non-HCI data transport is supported"); in qca_configure_hfp_offload()
1862 hdev->get_data_path_id = qca_get_data_path_id; in qca_configure_hfp_offload()
1863 /* Do not need to send HCI_Configure_Data_Path to configure non-HCI in qca_configure_hfp_offload()
1866 hdev->get_codec_config_data = NULL; in qca_configure_hfp_offload()
1872 struct hci_dev *hdev = hu->hdev; in qca_setup()
1873 struct qca_data *qca = hu->priv; in qca_setup()
1888 clear_bit(QCA_ROM_FW, &qca->flags); in qca_setup()
1890 set_bit(QCA_IBS_DISABLED, &qca->flags); in qca_setup()
1895 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); in qca_setup()
1927 qca->memdump_state = QCA_MEMDUMP_IDLE; in qca_setup()
1934 clear_bit(QCA_SSR_TRIGGERED, &qca->flags); in qca_setup()
1945 qcadev = serdev_device_get_drvdata(hu->serdev); in qca_setup()
1946 if (qcadev->bdaddr_property_broken) in qca_setup()
1947 set_bit(HCI_QUIRK_BDADDR_PROPERTY_BROKEN, &hdev->quirks); in qca_setup()
1992 clear_bit(QCA_IBS_DISABLED, &qca->flags); in qca_setup()
1994 hu->hdev->hw_error = qca_hw_error; in qca_setup()
1995 hu->hdev->reset = qca_reset; in qca_setup()
1996 if (hu->serdev) { in qca_setup()
1997 if (device_can_wakeup(hu->serdev->ctrl->dev.parent)) in qca_setup()
1998 hu->hdev->wakeup = qca_wakeup; in qca_setup()
2000 } else if (ret == -ENOENT) { in qca_setup()
2001 /* No patch/nvm-config found, run with original fw/config */ in qca_setup()
2002 set_bit(QCA_ROM_FW, &qca->flags); in qca_setup()
2004 } else if (ret == -EAGAIN) { in qca_setup()
2006 * Userspace firmware loader will return -EAGAIN in case no in qca_setup()
2007 * patch/nvm-config is found, so run with original fw/config. in qca_setup()
2009 set_bit(QCA_ROM_FW, &qca->flags); in qca_setup()
2017 if (hu->serdev) { in qca_setup()
2018 serdev_device_close(hu->serdev); in qca_setup()
2019 ret = serdev_device_open(hu->serdev); in qca_setup()
2031 hu->hdev->set_bdaddr = qca_set_bdaddr_rome; in qca_setup()
2033 hu->hdev->set_bdaddr = qca_set_bdaddr; in qca_setup()
2038 qca->fw_version = le16_to_cpu(ver.patch_ver); in qca_setup()
2039 qca->controller_id = le16_to_cpu(ver.rom_ver); in qca_setup()
2175 struct qca_data *qca = hu->priv; in qca_power_shutdown()
2185 spin_lock_irqsave(&qca->hci_ibs_lock, flags); in qca_power_shutdown()
2186 set_bit(QCA_IBS_DISABLED, &qca->flags); in qca_power_shutdown()
2188 spin_unlock_irqrestore(&qca->hci_ibs_lock, flags); in qca_power_shutdown()
2190 /* Non-serdev device usually is powered by external power in qca_power_shutdown()
2193 if (!hu->serdev) in qca_power_shutdown()
2196 qcadev = serdev_device_get_drvdata(hu->serdev); in qca_power_shutdown()
2197 power = qcadev->bt_power; in qca_power_shutdown()
2199 if (power && power->pwrseq) { in qca_power_shutdown()
2200 pwrseq_power_off(power->pwrseq); in qca_power_shutdown()
2201 set_bit(QCA_BT_OFF, &qca->flags); in qca_power_shutdown()
2217 gpiod_set_value_cansleep(qcadev->bt_en, 0); in qca_power_shutdown()
2220 if (qcadev->sw_ctrl) { in qca_power_shutdown()
2221 sw_ctrl_state = gpiod_get_value_cansleep(qcadev->sw_ctrl); in qca_power_shutdown()
2222 bt_dev_dbg(hu->hdev, "SW_CTRL is %d", sw_ctrl_state); in qca_power_shutdown()
2227 gpiod_set_value_cansleep(qcadev->bt_en, 0); in qca_power_shutdown()
2230 set_bit(QCA_BT_OFF, &qca->flags); in qca_power_shutdown()
2236 struct qca_data *qca = hu->priv; in qca_power_off()
2239 hu->hdev->hw_error = NULL; in qca_power_off()
2240 hu->hdev->reset = NULL; in qca_power_off()
2242 del_timer_sync(&qca->wake_retrans_timer); in qca_power_off()
2243 del_timer_sync(&qca->tx_idle_timer); in qca_power_off()
2247 && qca->memdump_state == QCA_MEMDUMP_IDLE) { in qca_power_off()
2258 struct qca_power *power = qcadev->bt_power; in qca_regulator_enable()
2261 if (power->pwrseq) in qca_regulator_enable()
2262 return pwrseq_power_on(power->pwrseq); in qca_regulator_enable()
2265 if (power->vregs_on) in qca_regulator_enable()
2268 BT_DBG("enabling %d regulators)", power->num_vregs); in qca_regulator_enable()
2270 ret = regulator_bulk_enable(power->num_vregs, power->vreg_bulk); in qca_regulator_enable()
2274 power->vregs_on = true; in qca_regulator_enable()
2276 ret = clk_prepare_enable(qcadev->susclk); in qca_regulator_enable()
2290 power = qcadev->bt_power; in qca_regulator_disable()
2293 if (!power->vregs_on) in qca_regulator_disable()
2296 regulator_bulk_disable(power->num_vregs, power->vreg_bulk); in qca_regulator_disable()
2297 power->vregs_on = false; in qca_regulator_disable()
2299 clk_disable_unprepare(qcadev->susclk); in qca_regulator_disable()
2309 bulk = devm_kcalloc(qca->dev, num_vregs, sizeof(*bulk), GFP_KERNEL); in qca_init_regulators()
2311 return -ENOMEM; in qca_init_regulators()
2316 ret = devm_regulator_bulk_get(qca->dev, num_vregs, bulk); in qca_init_regulators()
2326 qca->vreg_bulk = bulk; in qca_init_regulators()
2327 qca->num_vregs = num_vregs; in qca_init_regulators()
2340 qcadev = devm_kzalloc(&serdev->dev, sizeof(*qcadev), GFP_KERNEL); in qca_serdev_probe()
2342 return -ENOMEM; in qca_serdev_probe()
2344 qcadev->serdev_hu.serdev = serdev; in qca_serdev_probe()
2345 data = device_get_match_data(&serdev->dev); in qca_serdev_probe()
2347 device_property_read_string_array(&serdev->dev, "firmware-name", in qca_serdev_probe()
2348 qcadev->firmware_name, ARRAY_SIZE(qcadev->firmware_name)); in qca_serdev_probe()
2349 device_property_read_u32(&serdev->dev, "max-speed", in qca_serdev_probe()
2350 &qcadev->oper_speed); in qca_serdev_probe()
2351 if (!qcadev->oper_speed) in qca_serdev_probe()
2354 qcadev->bdaddr_property_broken = device_property_read_bool(&serdev->dev, in qca_serdev_probe()
2355 "qcom,local-bd-address-broken"); in qca_serdev_probe()
2358 qcadev->btsoc_type = data->soc_type; in qca_serdev_probe()
2360 qcadev->btsoc_type = QCA_ROME; in qca_serdev_probe()
2362 switch (qcadev->btsoc_type) { in qca_serdev_probe()
2372 qcadev->bt_power = devm_kzalloc(&serdev->dev, in qca_serdev_probe()
2375 if (!qcadev->bt_power) in qca_serdev_probe()
2376 return -ENOMEM; in qca_serdev_probe()
2382 switch (qcadev->btsoc_type) { in qca_serdev_probe()
2386 if (!device_property_present(&serdev->dev, "enable-gpios")) { in qca_serdev_probe()
2389 * node doesn't have the 'enable-gpios' property then in qca_serdev_probe()
2393 qcadev->bt_power->pwrseq = devm_pwrseq_get(&serdev->dev, in qca_serdev_probe()
2395 if (IS_ERR(qcadev->bt_power->pwrseq)) in qca_serdev_probe()
2396 return PTR_ERR(qcadev->bt_power->pwrseq); in qca_serdev_probe()
2406 qcadev->bt_power->dev = &serdev->dev; in qca_serdev_probe()
2407 err = qca_init_regulators(qcadev->bt_power, data->vregs, in qca_serdev_probe()
2408 data->num_vregs); in qca_serdev_probe()
2414 qcadev->bt_power->vregs_on = false; in qca_serdev_probe()
2416 qcadev->bt_en = devm_gpiod_get_optional(&serdev->dev, "enable", in qca_serdev_probe()
2418 if (IS_ERR(qcadev->bt_en) && in qca_serdev_probe()
2419 (data->soc_type == QCA_WCN6750 || in qca_serdev_probe()
2420 data->soc_type == QCA_WCN6855)) { in qca_serdev_probe()
2421 dev_err(&serdev->dev, "failed to acquire BT_EN gpio\n"); in qca_serdev_probe()
2422 return PTR_ERR(qcadev->bt_en); in qca_serdev_probe()
2425 if (!qcadev->bt_en) in qca_serdev_probe()
2428 qcadev->sw_ctrl = devm_gpiod_get_optional(&serdev->dev, "swctrl", in qca_serdev_probe()
2430 if (IS_ERR(qcadev->sw_ctrl) && in qca_serdev_probe()
2431 (data->soc_type == QCA_WCN6750 || in qca_serdev_probe()
2432 data->soc_type == QCA_WCN6855 || in qca_serdev_probe()
2433 data->soc_type == QCA_WCN7850)) { in qca_serdev_probe()
2434 dev_err(&serdev->dev, "failed to acquire SW_CTRL gpio\n"); in qca_serdev_probe()
2435 return PTR_ERR(qcadev->sw_ctrl); in qca_serdev_probe()
2438 qcadev->susclk = devm_clk_get_optional(&serdev->dev, NULL); in qca_serdev_probe()
2439 if (IS_ERR(qcadev->susclk)) { in qca_serdev_probe()
2440 dev_err(&serdev->dev, "failed to acquire clk\n"); in qca_serdev_probe()
2441 return PTR_ERR(qcadev->susclk); in qca_serdev_probe()
2446 if (dev_of_node(&serdev->dev)) { in qca_serdev_probe()
2447 qcadev->bt_power->pwrseq = devm_pwrseq_get(&serdev->dev, in qca_serdev_probe()
2449 if (IS_ERR(qcadev->bt_power->pwrseq)) in qca_serdev_probe()
2450 return PTR_ERR(qcadev->bt_power->pwrseq); in qca_serdev_probe()
2456 qcadev->bt_en = devm_gpiod_get_optional(&serdev->dev, "enable", in qca_serdev_probe()
2458 if (IS_ERR(qcadev->bt_en)) { in qca_serdev_probe()
2459 dev_err(&serdev->dev, "failed to acquire enable gpio\n"); in qca_serdev_probe()
2460 return PTR_ERR(qcadev->bt_en); in qca_serdev_probe()
2463 if (!qcadev->bt_en) in qca_serdev_probe()
2466 qcadev->susclk = devm_clk_get_optional_enabled_with_rate( in qca_serdev_probe()
2467 &serdev->dev, NULL, SUSCLK_RATE_32KHZ); in qca_serdev_probe()
2468 if (IS_ERR(qcadev->susclk)) { in qca_serdev_probe()
2469 dev_warn(&serdev->dev, "failed to acquire clk\n"); in qca_serdev_probe()
2470 return PTR_ERR(qcadev->susclk); in qca_serdev_probe()
2474 err = hci_uart_register_device(&qcadev->serdev_hu, &qca_proto); in qca_serdev_probe()
2480 hdev = qcadev->serdev_hu.hdev; in qca_serdev_probe()
2483 set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks); in qca_serdev_probe()
2484 hdev->shutdown = qca_power_off; in qca_serdev_probe()
2491 if (data->capabilities & QCA_CAP_WIDEBAND_SPEECH) in qca_serdev_probe()
2493 &hdev->quirks); in qca_serdev_probe()
2495 if (!(data->capabilities & QCA_CAP_VALID_LE_STATES)) in qca_serdev_probe()
2496 set_bit(HCI_QUIRK_BROKEN_LE_STATES, &hdev->quirks); in qca_serdev_probe()
2505 struct qca_power *power = qcadev->bt_power; in qca_serdev_remove()
2507 switch (qcadev->btsoc_type) { in qca_serdev_remove()
2515 if (power->vregs_on) in qca_serdev_remove()
2516 qca_power_shutdown(&qcadev->serdev_hu); in qca_serdev_remove()
2522 hci_uart_unregister_device(&qcadev->serdev_hu); in qca_serdev_remove()
2531 struct hci_uart *hu = &qcadev->serdev_hu; in qca_serdev_shutdown()
2532 struct hci_dev *hdev = hu->hdev; in qca_serdev_shutdown()
2536 if (qcadev->btsoc_type == QCA_QCA6390) { in qca_serdev_shutdown()
2538 * state and the state will ensure next hdev->setup() success. in qca_serdev_shutdown()
2540 * hdev->setup() can do its job regardless of SoC state, so in qca_serdev_shutdown()
2542 * if HCI_SETUP is set, it means that hdev->setup() was never in qca_serdev_shutdown()
2546 if (test_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks) || in qca_serdev_shutdown()
2551 * here, so also fix the use-after-free issue caused by that in qca_serdev_shutdown()
2580 struct hci_uart *hu = &qcadev->serdev_hu; in qca_suspend()
2581 struct qca_data *qca = hu->priv; in qca_suspend()
2588 set_bit(QCA_SUSPENDING, &qca->flags); in qca_suspend()
2591 * support in-band sleep in qca_suspend()
2593 if (test_bit(QCA_ROM_FW, &qca->flags)) in qca_suspend()
2600 if (test_bit(QCA_BT_OFF, &qca->flags) && in qca_suspend()
2601 !test_bit(QCA_SSR_TRIGGERED, &qca->flags)) in qca_suspend()
2604 if (test_bit(QCA_IBS_DISABLED, &qca->flags) || in qca_suspend()
2605 test_bit(QCA_SSR_TRIGGERED, &qca->flags)) { in qca_suspend()
2606 wait_timeout = test_bit(QCA_SSR_TRIGGERED, &qca->flags) ? in qca_suspend()
2614 wait_on_bit_timeout(&qca->flags, QCA_IBS_DISABLED, in qca_suspend()
2617 if (test_bit(QCA_IBS_DISABLED, &qca->flags)) { in qca_suspend()
2618 bt_dev_err(hu->hdev, "SSR or FW download time out"); in qca_suspend()
2619 ret = -ETIMEDOUT; in qca_suspend()
2624 cancel_work_sync(&qca->ws_awake_device); in qca_suspend()
2625 cancel_work_sync(&qca->ws_awake_rx); in qca_suspend()
2627 spin_lock_irqsave_nested(&qca->hci_ibs_lock, in qca_suspend()
2630 switch (qca->tx_ibs_state) { in qca_suspend()
2632 del_timer(&qca->wake_retrans_timer); in qca_suspend()
2635 del_timer(&qca->tx_idle_timer); in qca_suspend()
2637 serdev_device_write_flush(hu->serdev); in qca_suspend()
2639 ret = serdev_device_write_buf(hu->serdev, &cmd, sizeof(cmd)); in qca_suspend()
2646 qca->tx_ibs_state = HCI_IBS_TX_ASLEEP; in qca_suspend()
2647 qca->ibs_sent_slps++; in qca_suspend()
2655 BT_ERR("Spurious tx state %d", qca->tx_ibs_state); in qca_suspend()
2656 ret = -EINVAL; in qca_suspend()
2660 spin_unlock_irqrestore(&qca->hci_ibs_lock, flags); in qca_suspend()
2666 serdev_device_wait_until_sent(hu->serdev, in qca_suspend()
2674 ret = wait_event_interruptible_timeout(qca->suspend_wait_q, in qca_suspend()
2675 qca->rx_ibs_state == HCI_IBS_RX_ASLEEP, in qca_suspend()
2678 ret = -ETIMEDOUT; in qca_suspend()
2685 clear_bit(QCA_SUSPENDING, &qca->flags); in qca_suspend()
2694 struct hci_uart *hu = &qcadev->serdev_hu; in qca_resume()
2695 struct qca_data *qca = hu->priv; in qca_resume()
2697 clear_bit(QCA_SUSPENDING, &qca->flags); in qca_resume()
2706 { .compatible = "qcom,qca2066-bt", .data = &qca_soc_data_qca2066},
2707 { .compatible = "qcom,qca6174-bt" },
2708 { .compatible = "qcom,qca6390-bt", .data = &qca_soc_data_qca6390},
2709 { .compatible = "qcom,qca9377-bt" },
2710 { .compatible = "qcom,wcn3950-bt", .data = &qca_soc_data_wcn3950},
2711 { .compatible = "qcom,wcn3988-bt", .data = &qca_soc_data_wcn3988},
2712 { .compatible = "qcom,wcn3990-bt", .data = &qca_soc_data_wcn3990},
2713 { .compatible = "qcom,wcn3991-bt", .data = &qca_soc_data_wcn3991},
2714 { .compatible = "qcom,wcn3998-bt", .data = &qca_soc_data_wcn3998},
2715 { .compatible = "qcom,wcn6750-bt", .data = &qca_soc_data_wcn6750},
2716 { .compatible = "qcom,wcn6855-bt", .data = &qca_soc_data_wcn6855},
2717 { .compatible = "qcom,wcn7850-bt", .data = &qca_soc_data_wcn7850},
2740 struct hci_uart *hu = &qcadev->serdev_hu; in hciqca_coredump()
2741 struct hci_dev *hdev = hu->hdev; in hciqca_coredump()
2743 if (hdev->dump.coredump) in hciqca_coredump()
2744 hdev->dump.coredump(hdev); in hciqca_coredump()