Lines Matching +full:- +full:1200 +full:ps
1 // SPDX-License-Identifier: GPL-2.0-or-later
78 /* Default ps timeout period in milliseconds */
128 u8 target_ps_mode; /* ps mode to be set */
325 struct ps_data *psdata = &nxpdev->psdata; in nxp_drv_send_cmd()
331 psdata->driver_sent_cmd = true; in nxp_drv_send_cmd()
333 psdata->driver_sent_cmd = false; in nxp_drv_send_cmd()
340 if (schedule_work(&nxpdev->tx_work)) in btnxpuart_tx_wakeup()
341 set_bit(BTNXPUART_TX_STATE_ACTIVE, &nxpdev->tx_state); in btnxpuart_tx_wakeup()
347 struct ps_data *psdata = &nxpdev->psdata; in ps_start_timer()
352 if (psdata->cur_psmode == PS_MODE_ENABLE) in ps_start_timer()
353 mod_timer(&psdata->ps_timer, jiffies + msecs_to_jiffies(psdata->h2c_ps_interval)); in ps_start_timer()
355 if (psdata->ps_state == PS_STATE_AWAKE && psdata->ps_cmd == PS_CMD_ENTER_PS) in ps_start_timer()
356 cancel_work_sync(&psdata->work); in ps_start_timer()
361 struct ps_data *psdata = &nxpdev->psdata; in ps_cancel_timer()
363 flush_work(&psdata->work); in ps_cancel_timer()
364 timer_shutdown_sync(&psdata->ps_timer); in ps_cancel_timer()
370 struct ps_data *psdata = &nxpdev->psdata; in ps_control()
373 if (psdata->ps_state == ps_state || in ps_control()
374 !test_bit(BTNXPUART_SERDEV_OPEN, &nxpdev->tx_state)) in ps_control()
377 mutex_lock(&psdata->ps_lock); in ps_control()
378 switch (psdata->cur_h2c_wakeupmode) { in ps_control()
381 gpiod_set_value_cansleep(psdata->h2c_ps_gpio, 0); in ps_control()
383 gpiod_set_value_cansleep(psdata->h2c_ps_gpio, 1); in ps_control()
389 status = serdev_device_set_tiocm(nxpdev->serdev, TIOCM_DTR, 0); in ps_control()
391 status = serdev_device_set_tiocm(nxpdev->serdev, 0, TIOCM_DTR); in ps_control()
396 status = serdev_device_break_ctl(nxpdev->serdev, 0); in ps_control()
398 status = serdev_device_break_ctl(nxpdev->serdev, -1); in ps_control()
399 msleep(20); /* Allow chip to detect UART-break and enter sleep */ in ps_control()
405 psdata->ps_state = ps_state; in ps_control()
406 mutex_unlock(&psdata->ps_lock); in ps_control()
416 if (data->ps_cmd == PS_CMD_ENTER_PS && data->cur_psmode == PS_MODE_ENABLE) in ps_work_func()
417 ps_control(data->hdev, PS_STATE_SLEEP); in ps_work_func()
418 else if (data->ps_cmd == PS_CMD_EXIT_PS) in ps_work_func()
419 ps_control(data->hdev, PS_STATE_AWAKE); in ps_work_func()
425 struct hci_dev *hdev = data->hdev; in ps_timeout_func()
428 if (test_bit(BTNXPUART_TX_STATE_ACTIVE, &nxpdev->tx_state)) { in ps_timeout_func()
431 data->ps_cmd = PS_CMD_ENTER_PS; in ps_timeout_func()
432 schedule_work(&data->work); in ps_timeout_func()
439 struct serdev_device *serdev = nxpdev->serdev; in ps_setup()
440 struct ps_data *psdata = &nxpdev->psdata; in ps_setup()
442 psdata->h2c_ps_gpio = devm_gpiod_get_optional(&serdev->dev, "device-wakeup", in ps_setup()
444 if (IS_ERR(psdata->h2c_ps_gpio)) { in ps_setup()
445 bt_dev_err(hdev, "Error fetching device-wakeup-gpios: %ld", in ps_setup()
446 PTR_ERR(psdata->h2c_ps_gpio)); in ps_setup()
447 return PTR_ERR(psdata->h2c_ps_gpio); in ps_setup()
450 if (!psdata->h2c_ps_gpio) in ps_setup()
451 psdata->h2c_wakeup_gpio = 0xff; in ps_setup()
453 psdata->hdev = hdev; in ps_setup()
454 INIT_WORK(&psdata->work, ps_work_func); in ps_setup()
455 mutex_init(&psdata->ps_lock); in ps_setup()
456 timer_setup(&psdata->ps_timer, ps_timeout_func, 0); in ps_setup()
463 struct ps_data *psdata = &nxpdev->psdata; in ps_wakeup()
466 mutex_lock(&psdata->ps_lock); in ps_wakeup()
467 ps_state = psdata->ps_state; in ps_wakeup()
468 mutex_unlock(&psdata->ps_lock); in ps_wakeup()
471 psdata->ps_cmd = PS_CMD_EXIT_PS; in ps_wakeup()
472 schedule_work(&psdata->work); in ps_wakeup()
480 struct ps_data *psdata = &nxpdev->psdata; in ps_cleanup()
483 mutex_lock(&psdata->ps_lock); in ps_cleanup()
484 ps_state = psdata->ps_state; in ps_cleanup()
485 mutex_unlock(&psdata->ps_lock); in ps_cleanup()
488 ps_control(psdata->hdev, PS_STATE_AWAKE); in ps_cleanup()
491 cancel_work_sync(&psdata->work); in ps_cleanup()
492 mutex_destroy(&psdata->ps_lock); in ps_cleanup()
498 struct ps_data *psdata = &nxpdev->psdata; in send_ps_cmd()
503 if (psdata->target_ps_mode == PS_MODE_ENABLE) in send_ps_cmd()
507 pcmd.c2h_ps_interval = __cpu_to_le16(psdata->c2h_ps_interval); in send_ps_cmd()
518 psdata->cur_psmode = psdata->target_ps_mode; in send_ps_cmd()
520 psdata->target_ps_mode = psdata->cur_psmode; in send_ps_cmd()
521 if (psdata->cur_psmode == PS_MODE_ENABLE) in send_ps_cmd()
526 *status, psdata->cur_psmode); in send_ps_cmd()
536 struct ps_data *psdata = &nxpdev->psdata; in send_wakeup_method_cmd()
541 pcmd.c2h_wakeupmode = psdata->c2h_wakeupmode; in send_wakeup_method_cmd()
542 pcmd.c2h_wakeup_gpio = psdata->c2h_wakeup_gpio; in send_wakeup_method_cmd()
543 switch (psdata->h2c_wakeupmode) { in send_wakeup_method_cmd()
559 bt_dev_err(hdev, "Setting wake-up method failed (%ld)", PTR_ERR(skb)); in send_wakeup_method_cmd()
566 psdata->cur_h2c_wakeupmode = psdata->h2c_wakeupmode; in send_wakeup_method_cmd()
568 psdata->h2c_wakeupmode = psdata->cur_h2c_wakeupmode; in send_wakeup_method_cmd()
570 *status, psdata->cur_h2c_wakeupmode); in send_wakeup_method_cmd()
580 struct ps_data *psdata = &nxpdev->psdata; in ps_init()
583 serdev_device_set_tiocm(nxpdev->serdev, 0, TIOCM_RTS); in ps_init()
585 serdev_device_set_tiocm(nxpdev->serdev, TIOCM_RTS, 0); in ps_init()
588 psdata->ps_state = PS_STATE_AWAKE; in ps_init()
589 psdata->c2h_wakeupmode = BT_HOST_WAKEUP_METHOD_NONE; in ps_init()
590 psdata->c2h_wakeup_gpio = 0xff; in ps_init()
592 psdata->cur_h2c_wakeupmode = WAKEUP_METHOD_INVALID; in ps_init()
593 if (psdata->h2c_ps_gpio) in ps_init()
596 psdata->h2c_ps_interval = PS_DEFAULT_TIMEOUT_PERIOD_MS; in ps_init()
600 psdata->h2c_wakeupmode = WAKEUP_METHOD_GPIO; in ps_init()
601 gpiod_set_value_cansleep(psdata->h2c_ps_gpio, 0); in ps_init()
605 psdata->h2c_wakeupmode = WAKEUP_METHOD_DTR; in ps_init()
606 serdev_device_set_tiocm(nxpdev->serdev, 0, TIOCM_DTR); in ps_init()
607 serdev_device_set_tiocm(nxpdev->serdev, TIOCM_DTR, 0); in ps_init()
611 psdata->h2c_wakeupmode = WAKEUP_METHOD_BREAK; in ps_init()
612 serdev_device_break_ctl(nxpdev->serdev, -1); in ps_init()
614 serdev_device_break_ctl(nxpdev->serdev, 0); in ps_init()
619 psdata->cur_psmode = PS_MODE_DISABLE; in ps_init()
620 psdata->target_ps_mode = DEFAULT_PS_MODE; in ps_init()
622 if (psdata->cur_h2c_wakeupmode != psdata->h2c_wakeupmode) in ps_init()
624 if (psdata->cur_psmode != psdata->target_ps_mode) in ps_init()
634 nxpdev->fw_dnld_v1_offset = 0; in nxp_download_firmware()
635 nxpdev->fw_v1_sent_bytes = 0; in nxp_download_firmware()
636 nxpdev->fw_v1_expected_len = HDR_LEN; in nxp_download_firmware()
637 nxpdev->boot_reg_offset = 0; in nxp_download_firmware()
638 nxpdev->fw_dnld_v3_offset = 0; in nxp_download_firmware()
639 nxpdev->fw_v3_offset_correction = 0; in nxp_download_firmware()
640 nxpdev->baudrate_changed = false; in nxp_download_firmware()
641 nxpdev->timeout_changed = false; in nxp_download_firmware()
642 nxpdev->helper_downloaded = false; in nxp_download_firmware()
644 serdev_device_set_baudrate(nxpdev->serdev, HCI_NXP_PRI_BAUDRATE); in nxp_download_firmware()
645 serdev_device_set_flow_control(nxpdev->serdev, false); in nxp_download_firmware()
646 nxpdev->current_baudrate = HCI_NXP_PRI_BAUDRATE; in nxp_download_firmware()
649 err = wait_event_interruptible_timeout(nxpdev->fw_dnld_done_wait_q, in nxp_download_firmware()
651 &nxpdev->tx_state), in nxp_download_firmware()
654 release_firmware(nxpdev->fw); in nxp_download_firmware()
655 memset(nxpdev->fw_name, 0, sizeof(nxpdev->fw_name)); in nxp_download_firmware()
659 nxpdev->fw_dnld_v1_offset ? in nxp_download_firmware()
660 nxpdev->fw_dnld_v1_offset : in nxp_download_firmware()
661 nxpdev->fw_dnld_v3_offset); in nxp_download_firmware()
662 return -ETIMEDOUT; in nxp_download_firmware()
664 if (test_bit(BTNXPUART_FW_DOWNLOAD_ABORT, &nxpdev->tx_state)) { in nxp_download_firmware()
666 return -EINTR; in nxp_download_firmware()
669 serdev_device_set_flow_control(nxpdev->serdev, true); in nxp_download_firmware()
672 msleep(1200); in nxp_download_firmware()
688 serdev_device_write_buf(nxpdev->serdev, ack_nak, len); in nxp_send_ack()
696 u32 clkdivaddr = CLKDIVADDR - nxpdev->boot_reg_offset; in nxp_fw_change_baudrate()
697 u32 uartdivaddr = UARTDIVADDR - nxpdev->boot_reg_offset; in nxp_fw_change_baudrate()
698 u32 uartmcraddr = UARTMCRADDR - nxpdev->boot_reg_offset; in nxp_fw_change_baudrate()
699 u32 uartreinitaddr = UARTREINITADDR - nxpdev->boot_reg_offset; in nxp_fw_change_baudrate()
700 u32 uarticraddr = UARTICRADDR - nxpdev->boot_reg_offset; in nxp_fw_change_baudrate()
701 u32 uartfcraddr = UARTFCRADDR - nxpdev->boot_reg_offset; in nxp_fw_change_baudrate()
709 sizeof(nxp_cmd5) - 4)); in nxp_fw_change_baudrate()
711 serdev_device_write_buf(nxpdev->serdev, (u8 *)&nxp_cmd5, sizeof(nxp_cmd5)); in nxp_fw_change_baudrate()
712 nxpdev->fw_v3_offset_correction += req_len; in nxp_fw_change_baudrate()
728 sizeof(uart_config) - 4)); in nxp_fw_change_baudrate()
730 serdev_device_write_buf(nxpdev->serdev, (u8 *)&uart_config, sizeof(uart_config)); in nxp_fw_change_baudrate()
731 serdev_device_wait_until_sent(nxpdev->serdev, 0); in nxp_fw_change_baudrate()
732 nxpdev->fw_v3_offset_correction += req_len; in nxp_fw_change_baudrate()
751 sizeof(nxp_cmd7) - 4)); in nxp_fw_change_timeout()
752 serdev_device_write_buf(nxpdev->serdev, (u8 *)&nxp_cmd7, sizeof(nxp_cmd7)); in nxp_fw_change_timeout()
753 serdev_device_wait_until_sent(nxpdev->serdev, 0); in nxp_fw_change_timeout()
754 nxpdev->fw_v3_offset_correction += req_len; in nxp_fw_change_timeout()
762 return __le32_to_cpu(hdr->payload_len); in nxp_get_data_len()
767 return test_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state); in is_fw_downloading()
772 if (test_bit(BTNXPUART_CHECK_BOOT_SIGNATURE, &nxpdev->tx_state)) { in process_boot_signature()
773 clear_bit(BTNXPUART_CHECK_BOOT_SIGNATURE, &nxpdev->tx_state); in process_boot_signature()
774 wake_up_interruptible(&nxpdev->check_boot_sign_wait_q); in process_boot_signature()
788 return -ENOENT; in nxp_request_firmware()
790 if (!strlen(nxpdev->fw_name)) { in nxp_request_firmware()
792 !device_property_read_string(&nxpdev->serdev->dev, in nxp_request_firmware()
793 "firmware-name", in nxp_request_firmware()
796 snprintf(nxpdev->fw_name, MAX_FW_FILE_NAME_LEN, "nxp/%s", fw_name); in nxp_request_firmware()
797 err = request_firmware_direct(&nxpdev->fw, nxpdev->fw_name, &hdev->dev); in nxp_request_firmware()
799 snprintf(nxpdev->fw_name, MAX_FW_FILE_NAME_LEN, "nxp/%s", fw_name_old); in nxp_request_firmware()
800 err = request_firmware_direct(&nxpdev->fw, nxpdev->fw_name, &hdev->dev); in nxp_request_firmware()
803 bt_dev_info(hdev, "Request Firmware: %s", nxpdev->fw_name); in nxp_request_firmware()
805 bt_dev_err(hdev, "Firmware file %s not found", nxpdev->fw_name); in nxp_request_firmware()
806 clear_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state); in nxp_request_firmware()
823 chip_id = le16_to_cpu(req->chip_id ^ req->chip_id_comp); in nxp_recv_chip_ver_v1()
824 if (chip_id == 0xffff && nxpdev->fw_dnld_v1_offset) { in nxp_recv_chip_ver_v1()
825 nxpdev->fw_dnld_v1_offset = 0; in nxp_recv_chip_ver_v1()
826 nxpdev->fw_v1_sent_bytes = 0; in nxp_recv_chip_ver_v1()
827 nxpdev->fw_v1_expected_len = HDR_LEN; in nxp_recv_chip_ver_v1()
828 release_firmware(nxpdev->fw); in nxp_recv_chip_ver_v1()
829 memset(nxpdev->fw_name, 0, sizeof(nxpdev->fw_name)); in nxp_recv_chip_ver_v1()
841 struct btnxpuart_data *nxp_data = nxpdev->nxp_data; in nxp_recv_fw_req_v1()
852 len = __le16_to_cpu(req->len ^ req->len_comp); in nxp_recv_fw_req_v1()
860 len = __le16_to_cpu(req->len); in nxp_recv_fw_req_v1()
862 if (!nxp_data->helper_fw_name) { in nxp_recv_fw_req_v1()
863 if (!nxpdev->timeout_changed) { in nxp_recv_fw_req_v1()
864 nxpdev->timeout_changed = nxp_fw_change_timeout(hdev, in nxp_recv_fw_req_v1()
868 if (!nxpdev->baudrate_changed) { in nxp_recv_fw_req_v1()
869 nxpdev->baudrate_changed = nxp_fw_change_baudrate(hdev, in nxp_recv_fw_req_v1()
871 if (nxpdev->baudrate_changed) { in nxp_recv_fw_req_v1()
872 serdev_device_set_baudrate(nxpdev->serdev, in nxp_recv_fw_req_v1()
874 serdev_device_set_flow_control(nxpdev->serdev, true); in nxp_recv_fw_req_v1()
875 nxpdev->current_baudrate = HCI_NXP_SEC_BAUDRATE; in nxp_recv_fw_req_v1()
881 if (!nxp_data->helper_fw_name || nxpdev->helper_downloaded) { in nxp_recv_fw_req_v1()
882 if (nxp_request_firmware(hdev, nxp_data->fw_name, nxp_data->fw_name_old)) in nxp_recv_fw_req_v1()
884 } else if (nxp_data->helper_fw_name && !nxpdev->helper_downloaded) { in nxp_recv_fw_req_v1()
885 if (nxp_request_firmware(hdev, nxp_data->helper_fw_name, NULL)) in nxp_recv_fw_req_v1()
891 nxpdev->fw->size); in nxp_recv_fw_req_v1()
892 if (nxp_data->helper_fw_name && !nxpdev->helper_downloaded) { in nxp_recv_fw_req_v1()
893 nxpdev->helper_downloaded = true; in nxp_recv_fw_req_v1()
894 serdev_device_wait_until_sent(nxpdev->serdev, 0); in nxp_recv_fw_req_v1()
895 serdev_device_set_baudrate(nxpdev->serdev, in nxp_recv_fw_req_v1()
897 serdev_device_set_flow_control(nxpdev->serdev, true); in nxp_recv_fw_req_v1()
899 clear_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state); in nxp_recv_fw_req_v1()
900 wake_up_interruptible(&nxpdev->fw_dnld_done_wait_q); in nxp_recv_fw_req_v1()
908 len = nxpdev->fw_v1_sent_bytes; in nxp_recv_fw_req_v1()
911 nxpdev->fw_dnld_v1_offset += nxpdev->fw_v1_sent_bytes; in nxp_recv_fw_req_v1()
921 * and we need to re-send the previous header again. in nxp_recv_fw_req_v1()
923 if (len == nxpdev->fw_v1_expected_len) { in nxp_recv_fw_req_v1()
925 nxpdev->fw_v1_expected_len = nxp_get_data_len(nxpdev->fw->data + in nxp_recv_fw_req_v1()
926 nxpdev->fw_dnld_v1_offset); in nxp_recv_fw_req_v1()
928 nxpdev->fw_v1_expected_len = HDR_LEN; in nxp_recv_fw_req_v1()
931 nxpdev->fw_dnld_v1_offset -= nxpdev->fw_v1_sent_bytes; in nxp_recv_fw_req_v1()
932 nxpdev->fw_v1_expected_len = HDR_LEN; in nxp_recv_fw_req_v1()
936 if (nxpdev->fw_dnld_v1_offset + len <= nxpdev->fw->size) in nxp_recv_fw_req_v1()
937 serdev_device_write_buf(nxpdev->serdev, nxpdev->fw->data + in nxp_recv_fw_req_v1()
938 nxpdev->fw_dnld_v1_offset, len); in nxp_recv_fw_req_v1()
939 nxpdev->fw_v1_sent_bytes = len; in nxp_recv_fw_req_v1()
964 nxpdev->boot_reg_offset = 1; in nxp_get_fw_name_from_chipid()
1032 chip_id = le16_to_cpu(req->chip_id); in nxp_recv_chip_ver_v3()
1033 loader_ver = req->loader_ver; in nxp_recv_chip_ver_v3()
1048 __u32 offset = __le32_to_cpu(req->offset); in nxp_handle_fw_download_error()
1049 __u16 err = __le16_to_cpu(req->error); in nxp_handle_fw_download_error()
1059 sizeof(nak_tx_buf) - 1, 0xff); in nxp_handle_fw_download_error()
1060 serdev_device_write_buf(nxpdev->serdev, nak_tx_buf.buf, in nxp_handle_fw_download_error()
1082 if (!req || !nxpdev->fw) in nxp_recv_fw_req_v3()
1085 if (!req->error) { in nxp_recv_fw_req_v3()
1092 len = __le16_to_cpu(req->len); in nxp_recv_fw_req_v3()
1094 if (!nxpdev->timeout_changed) { in nxp_recv_fw_req_v3()
1095 nxpdev->timeout_changed = nxp_fw_change_timeout(hdev, len); in nxp_recv_fw_req_v3()
1099 if (!nxpdev->baudrate_changed) { in nxp_recv_fw_req_v3()
1100 nxpdev->baudrate_changed = nxp_fw_change_baudrate(hdev, len); in nxp_recv_fw_req_v3()
1101 if (nxpdev->baudrate_changed) { in nxp_recv_fw_req_v3()
1102 serdev_device_set_baudrate(nxpdev->serdev, in nxp_recv_fw_req_v3()
1104 serdev_device_set_flow_control(nxpdev->serdev, true); in nxp_recv_fw_req_v3()
1105 nxpdev->current_baudrate = HCI_NXP_SEC_BAUDRATE; in nxp_recv_fw_req_v3()
1110 if (req->len == 0) { in nxp_recv_fw_req_v3()
1112 nxpdev->fw->size); in nxp_recv_fw_req_v3()
1113 clear_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state); in nxp_recv_fw_req_v3()
1114 wake_up_interruptible(&nxpdev->fw_dnld_done_wait_q); in nxp_recv_fw_req_v3()
1118 offset = __le32_to_cpu(req->offset); in nxp_recv_fw_req_v3()
1119 if (offset < nxpdev->fw_v3_offset_correction) { in nxp_recv_fw_req_v3()
1128 nxpdev->fw_dnld_v3_offset = offset - nxpdev->fw_v3_offset_correction; in nxp_recv_fw_req_v3()
1129 serdev_device_write_buf(nxpdev->serdev, nxpdev->fw->data + in nxp_recv_fw_req_v3()
1130 nxpdev->fw_dnld_v3_offset, len); in nxp_recv_fw_req_v3()
1140 __le32 new_baudrate = __cpu_to_le32(nxpdev->new_baudrate); in nxp_set_baudrate_cmd()
1141 struct ps_data *psdata = &nxpdev->psdata; in nxp_set_baudrate_cmd()
1157 serdev_device_set_baudrate(nxpdev->serdev, nxpdev->new_baudrate); in nxp_set_baudrate_cmd()
1158 nxpdev->current_baudrate = nxpdev->new_baudrate; in nxp_set_baudrate_cmd()
1161 *status, nxpdev->new_baudrate); in nxp_set_baudrate_cmd()
1170 serdev_device_set_baudrate(nxpdev->serdev, HCI_NXP_PRI_BAUDRATE); in nxp_check_boot_sign()
1171 if (test_bit(BTNXPUART_IR_IN_PROGRESS, &nxpdev->tx_state)) in nxp_check_boot_sign()
1172 serdev_device_set_flow_control(nxpdev->serdev, false); in nxp_check_boot_sign()
1174 serdev_device_set_flow_control(nxpdev->serdev, true); in nxp_check_boot_sign()
1175 set_bit(BTNXPUART_CHECK_BOOT_SIGNATURE, &nxpdev->tx_state); in nxp_check_boot_sign()
1177 return wait_event_interruptible_timeout(nxpdev->check_boot_sign_wait_q, in nxp_check_boot_sign()
1179 &nxpdev->tx_state), in nxp_check_boot_sign()
1191 return -ENOMEM; in nxp_set_ind_reset()
1213 clear_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state); in nxp_setup()
1216 serdev_device_set_baudrate(nxpdev->serdev, nxpdev->fw_init_baudrate); in nxp_setup()
1217 nxpdev->current_baudrate = nxpdev->fw_init_baudrate; in nxp_setup()
1219 if (nxpdev->current_baudrate != HCI_NXP_SEC_BAUDRATE) { in nxp_setup()
1220 nxpdev->new_baudrate = HCI_NXP_SEC_BAUDRATE; in nxp_setup()
1226 if (test_and_clear_bit(BTNXPUART_IR_IN_PROGRESS, &nxpdev->tx_state)) in nxp_setup()
1238 set_bit(BTNXPUART_IR_IN_PROGRESS, &nxpdev->tx_state); in nxp_hw_err()
1253 if (test_bit(BTNXPUART_IR_IN_PROGRESS, &nxpdev->tx_state)) { in nxp_shutdown()
1260 serdev_device_set_flow_control(nxpdev->serdev, false); in nxp_shutdown()
1261 set_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state); in nxp_shutdown()
1275 skb_queue_tail(&nxpdev->txq, skb); in btnxpuart_queue_skb()
1283 struct ps_data *psdata = &nxpdev->psdata; in nxp_enqueue()
1290 * driver flags accordingly and ask driver to re-send the command to FW. in nxp_enqueue()
1295 if (bt_cb(skb)->pkt_type == HCI_COMMAND_PKT && !psdata->driver_sent_cmd) { in nxp_enqueue()
1296 hdr = (struct hci_command_hdr *)skb->data; in nxp_enqueue()
1297 if (hdr->plen != (skb->len - HCI_COMMAND_HDR_SIZE)) in nxp_enqueue()
1300 switch (__le16_to_cpu(hdr->opcode)) { in nxp_enqueue()
1302 if (hdr->plen == sizeof(ps_parm)) { in nxp_enqueue()
1303 memcpy(&ps_parm, skb->data + HCI_COMMAND_HDR_SIZE, hdr->plen); in nxp_enqueue()
1305 psdata->target_ps_mode = PS_MODE_ENABLE; in nxp_enqueue()
1307 psdata->target_ps_mode = PS_MODE_DISABLE; in nxp_enqueue()
1308 psdata->c2h_ps_interval = __le16_to_cpu(ps_parm.c2h_ps_interval); in nxp_enqueue()
1314 if (hdr->plen == sizeof(wakeup_parm)) { in nxp_enqueue()
1315 memcpy(&wakeup_parm, skb->data + HCI_COMMAND_HDR_SIZE, hdr->plen); in nxp_enqueue()
1316 psdata->c2h_wakeupmode = wakeup_parm.c2h_wakeupmode; in nxp_enqueue()
1317 psdata->c2h_wakeup_gpio = wakeup_parm.c2h_wakeup_gpio; in nxp_enqueue()
1318 psdata->h2c_wakeup_gpio = wakeup_parm.h2c_wakeup_gpio; in nxp_enqueue()
1321 psdata->h2c_wakeupmode = WAKEUP_METHOD_GPIO; in nxp_enqueue()
1324 psdata->h2c_wakeupmode = WAKEUP_METHOD_DTR; in nxp_enqueue()
1328 psdata->h2c_wakeupmode = WAKEUP_METHOD_BREAK; in nxp_enqueue()
1336 if (hdr->plen == sizeof(baudrate_parm)) { in nxp_enqueue()
1337 memcpy(&baudrate_parm, skb->data + HCI_COMMAND_HDR_SIZE, hdr->plen); in nxp_enqueue()
1338 nxpdev->new_baudrate = __le32_to_cpu(baudrate_parm); in nxp_enqueue()
1344 if (hdr->plen == 1) { in nxp_enqueue()
1366 return skb_dequeue(&nxpdev->txq); in nxp_dequeue()
1374 struct serdev_device *serdev = nxpdev->serdev; in btnxpuart_tx_work()
1375 struct hci_dev *hdev = nxpdev->hdev; in btnxpuart_tx_work()
1383 len = serdev_device_write_buf(serdev, skb->data, skb->len); in btnxpuart_tx_work()
1384 hdev->stat.byte_tx += len; in btnxpuart_tx_work()
1387 if (skb->len > 0) { in btnxpuart_tx_work()
1388 skb_queue_head(&nxpdev->txq, skb); in btnxpuart_tx_work()
1394 hdev->stat.cmd_tx++; in btnxpuart_tx_work()
1397 hdev->stat.acl_tx++; in btnxpuart_tx_work()
1400 hdev->stat.sco_tx++; in btnxpuart_tx_work()
1406 clear_bit(BTNXPUART_TX_STATE_ACTIVE, &nxpdev->tx_state); in btnxpuart_tx_work()
1414 err = serdev_device_open(nxpdev->serdev); in btnxpuart_open()
1417 dev_name(&nxpdev->serdev->dev)); in btnxpuart_open()
1419 set_bit(BTNXPUART_SERDEV_OPEN, &nxpdev->tx_state); in btnxpuart_open()
1428 serdev_device_close(nxpdev->serdev); in btnxpuart_close()
1429 skb_queue_purge(&nxpdev->txq); in btnxpuart_close()
1430 if (!IS_ERR_OR_NULL(nxpdev->rx_skb)) { in btnxpuart_close()
1431 kfree_skb(nxpdev->rx_skb); in btnxpuart_close()
1432 nxpdev->rx_skb = NULL; in btnxpuart_close()
1434 clear_bit(BTNXPUART_SERDEV_OPEN, &nxpdev->tx_state); in btnxpuart_close()
1443 serdev_device_write_flush(nxpdev->serdev); in btnxpuart_flush()
1444 skb_queue_purge(&nxpdev->txq); in btnxpuart_flush()
1446 cancel_work_sync(&nxpdev->tx_work); in btnxpuart_flush()
1448 if (!IS_ERR_OR_NULL(nxpdev->rx_skb)) { in btnxpuart_flush()
1449 kfree_skb(nxpdev->rx_skb); in btnxpuart_flush()
1450 nxpdev->rx_skb = NULL; in btnxpuart_flush()
1474 nxpdev->rx_skb = h4_recv_buf(nxpdev->hdev, nxpdev->rx_skb, data, count, in btnxpuart_receive_buf()
1476 if (IS_ERR(nxpdev->rx_skb)) { in btnxpuart_receive_buf()
1477 int err = PTR_ERR(nxpdev->rx_skb); in btnxpuart_receive_buf()
1478 /* Safe to ignore out-of-sync bootloader signatures */ in btnxpuart_receive_buf()
1480 bt_dev_err(nxpdev->hdev, "Frame reassembly failed (%d)", err); in btnxpuart_receive_buf()
1484 nxpdev->hdev->stat.byte_rx += count; in btnxpuart_receive_buf()
1503 nxpdev = devm_kzalloc(&serdev->dev, sizeof(*nxpdev), GFP_KERNEL); in nxp_serdev_probe()
1505 return -ENOMEM; in nxp_serdev_probe()
1507 nxpdev->nxp_data = (struct btnxpuart_data *)device_get_match_data(&serdev->dev); in nxp_serdev_probe()
1509 nxpdev->serdev = serdev; in nxp_serdev_probe()
1514 INIT_WORK(&nxpdev->tx_work, btnxpuart_tx_work); in nxp_serdev_probe()
1515 skb_queue_head_init(&nxpdev->txq); in nxp_serdev_probe()
1517 init_waitqueue_head(&nxpdev->fw_dnld_done_wait_q); in nxp_serdev_probe()
1518 init_waitqueue_head(&nxpdev->check_boot_sign_wait_q); in nxp_serdev_probe()
1520 device_property_read_u32(&nxpdev->serdev->dev, "fw-init-baudrate", in nxp_serdev_probe()
1521 &nxpdev->fw_init_baudrate); in nxp_serdev_probe()
1522 if (!nxpdev->fw_init_baudrate) in nxp_serdev_probe()
1523 nxpdev->fw_init_baudrate = FW_INIT_BAUDRATE; in nxp_serdev_probe()
1525 set_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state); in nxp_serdev_probe()
1532 dev_err(&serdev->dev, "Can't allocate HCI device\n"); in nxp_serdev_probe()
1533 return -ENOMEM; in nxp_serdev_probe()
1536 nxpdev->hdev = hdev; in nxp_serdev_probe()
1538 hdev->bus = HCI_UART; in nxp_serdev_probe()
1541 hdev->manufacturer = MANUFACTURER_NXP; in nxp_serdev_probe()
1542 hdev->open = btnxpuart_open; in nxp_serdev_probe()
1543 hdev->close = btnxpuart_close; in nxp_serdev_probe()
1544 hdev->flush = btnxpuart_flush; in nxp_serdev_probe()
1545 hdev->setup = nxp_setup; in nxp_serdev_probe()
1546 hdev->send = nxp_enqueue; in nxp_serdev_probe()
1547 hdev->hw_error = nxp_hw_err; in nxp_serdev_probe()
1548 hdev->shutdown = nxp_shutdown; in nxp_serdev_probe()
1549 SET_HCIDEV_DEV(hdev, &serdev->dev); in nxp_serdev_probe()
1552 dev_err(&serdev->dev, "Can't register HCI device\n"); in nxp_serdev_probe()
1563 return -ENODEV; in nxp_serdev_probe()
1569 struct hci_dev *hdev = nxpdev->hdev; in nxp_serdev_remove()
1572 set_bit(BTNXPUART_FW_DOWNLOAD_ABORT, &nxpdev->tx_state); in nxp_serdev_remove()
1573 clear_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state); in nxp_serdev_remove()
1574 wake_up_interruptible(&nxpdev->check_boot_sign_wait_q); in nxp_serdev_remove()
1575 wake_up_interruptible(&nxpdev->fw_dnld_done_wait_q); in nxp_serdev_remove()
1579 * driver baudrate in case this driver is re-inserted. in nxp_serdev_remove()
1581 if (nxpdev->current_baudrate != nxpdev->fw_init_baudrate) { in nxp_serdev_remove()
1582 nxpdev->new_baudrate = nxpdev->fw_init_baudrate; in nxp_serdev_remove()
1595 struct ps_data *psdata = &nxpdev->psdata; in nxp_serdev_suspend()
1597 ps_control(psdata->hdev, PS_STATE_SLEEP); in nxp_serdev_suspend()
1604 struct ps_data *psdata = &nxpdev->psdata; in nxp_serdev_resume()
1606 ps_control(psdata->hdev, PS_STATE_AWAKE); in nxp_serdev_resume()
1624 { .compatible = "nxp,88w8987-bt", .data = &w8987_data },
1625 { .compatible = "nxp,88w8997-bt", .data = &w8997_data },