Lines Matching +full:w155s2 +full:- +full:bt
1 // SPDX-License-Identifier: (GPL-2.0-only OR MIT)
121 * --------|-----------------------|---------|-------------|
136 return -ENOMEM; in aml_send_tci_cmd()
154 if (rsp->opcode != op_code || rsp->status != 0x00) { in aml_send_tci_cmd()
156 op_code, rsp->opcode, rsp->status); in aml_send_tci_cmd()
157 err = -EINVAL; in aml_send_tci_cmd()
173 value = ((AML_UART_CLK_SOURCE / baud) - 1) & 0x0FFF; in aml_update_chip_baudrate()
227 return -EINVAL; in aml_send_firmware()
236 return -EINVAL; in aml_send_firmware()
239 fw_size -= seg_size; in aml_send_firmware()
248 struct aml_serdev *amldev = serdev_device_get_drvdata(hu->serdev); in aml_download_firmware()
278 ret = request_firmware(&firmware, fw_name, &hdev->dev); in aml_download_firmware()
284 fw_len = (struct aml_fw_len *)firmware->data; in aml_download_firmware()
287 iccm_start = (u8 *)(firmware->data) + sizeof(struct aml_fw_len) in aml_download_firmware()
288 + amldev->aml_dev_data->iccm_offset; in aml_download_firmware()
289 iccm_len = fw_len->iccm_len - amldev->aml_dev_data->iccm_offset; in aml_download_firmware()
291 amldev->aml_dev_data->iccm_offset); in aml_download_firmware()
298 dccm_start = (u8 *)(firmware->data) + sizeof(struct aml_fw_len) + fw_len->iccm_len; in aml_download_firmware()
299 dccm_len = fw_len->dccm_len; in aml_download_firmware()
301 amldev->aml_dev_data->dccm_offset); in aml_download_firmware()
358 if (rsp->opcode != AML_BT_HCI_VENDOR_CMD || rsp->status != 0x00) { in aml_dump_fw_version()
360 rsp->opcode, rsp->status); in aml_dump_fw_version()
361 err = -EINVAL; in aml_dump_fw_version()
394 if (rsp->opcode != AML_BT_HCI_VENDOR_CMD || rsp->status != 0x00) { in aml_set_bdaddr()
395 bt_dev_err(hdev, "error response (0x%x):(%d)", rsp->opcode, rsp->status); in aml_set_bdaddr()
396 err = -EINVAL; in aml_set_bdaddr()
411 if (bacmp(&hdev->public_addr, BDADDR_ANY)) in aml_check_bdaddr()
426 if (!bacmp(&paddr->bdaddr, AML_BDADDR_DEFAULT)) { in aml_check_bdaddr()
427 bt_dev_info(hdev, "amlbt using default bdaddr (%pM)", &paddr->bdaddr); in aml_check_bdaddr()
428 set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks); in aml_check_bdaddr()
440 /* Use a single antenna when co-existing with wifi */ in aml_config_rf()
451 struct device *pdev = amldev->dev; in aml_parse_dt()
453 amldev->bt_en_gpio = devm_gpiod_get(pdev, "enable", in aml_parse_dt()
455 if (IS_ERR(amldev->bt_en_gpio)) { in aml_parse_dt()
457 return PTR_ERR(amldev->bt_en_gpio); in aml_parse_dt()
460 if (device_property_read_string(pdev, "firmware-name", in aml_parse_dt()
461 &amldev->firmware_name)) { in aml_parse_dt()
463 return -ENODEV; in aml_parse_dt()
466 amldev->bt_supply = devm_regulator_get(pdev, "vddio"); in aml_parse_dt()
467 if (IS_ERR(amldev->bt_supply)) { in aml_parse_dt()
469 return PTR_ERR(amldev->bt_supply); in aml_parse_dt()
472 amldev->lpo_clk = devm_clk_get(pdev, NULL); in aml_parse_dt()
473 if (IS_ERR(amldev->lpo_clk)) { in aml_parse_dt()
475 return PTR_ERR(amldev->lpo_clk); in aml_parse_dt()
485 err = regulator_enable(amldev->bt_supply); in aml_power_on()
487 dev_err(amldev->dev, "Failed to enable regulator: (%d)", err); in aml_power_on()
491 err = clk_prepare_enable(amldev->lpo_clk); in aml_power_on()
493 dev_err(amldev->dev, "Failed to enable lpo clock: (%d)", err); in aml_power_on()
497 gpiod_set_value_cansleep(amldev->bt_en_gpio, 1); in aml_power_on()
506 gpiod_set_value_cansleep(amldev->bt_en_gpio, 0); in aml_power_off()
508 clk_disable_unprepare(amldev->lpo_clk); in aml_power_off()
510 regulator_disable(amldev->bt_supply); in aml_power_off()
518 if (aml_update_chip_baudrate(hu->hdev, speed) != 0) { in aml_set_baudrate()
519 bt_dev_err(hu->hdev, "Failed to update baud rate"); in aml_set_baudrate()
520 return -EINVAL; in aml_set_baudrate()
524 serdev_device_set_baudrate(hu->serdev, speed); in aml_set_baudrate()
532 struct aml_serdev *amldev = serdev_device_get_drvdata(hu->serdev); in aml_open()
541 bt_dev_err(hu->hdev, "no flow control"); in aml_open()
542 return -EOPNOTSUPP; in aml_open()
547 return -ENOMEM; in aml_open()
549 skb_queue_head_init(&aml_data->txq); in aml_open()
551 hu->priv = aml_data; in aml_open()
558 struct aml_serdev *amldev = serdev_device_get_drvdata(hu->serdev); in aml_close()
559 struct aml_data *aml_data = hu->priv; in aml_close()
561 skb_queue_purge(&aml_data->txq); in aml_close()
562 kfree_skb(aml_data->rx_skb); in aml_close()
565 hu->priv = NULL; in aml_close()
572 struct aml_data *aml_data = hu->priv; in aml_flush()
574 skb_queue_purge(&aml_data->txq); in aml_flush()
581 struct aml_serdev *amldev = serdev_device_get_drvdata(hu->serdev); in aml_setup()
582 struct hci_dev *hdev = amldev->serdev_hu.hdev; in aml_setup()
586 hdev->set_bdaddr = aml_set_bdaddr; in aml_setup()
592 err = aml_set_baudrate(hu, amldev->serdev_hu.proto->oper_speed); in aml_setup()
596 err = aml_download_firmware(hdev, amldev->firmware_name); in aml_setup()
600 err = aml_config_rf(hdev, amldev->aml_dev_data->is_coex); in aml_setup()
628 struct aml_data *aml_data = hu->priv; in aml_enqueue()
630 skb_queue_tail(&aml_data->txq, skb); in aml_enqueue()
637 struct aml_data *aml_data = hu->priv; in aml_dequeue()
640 skb = skb_dequeue(&aml_data->txq); in aml_dequeue()
644 memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); in aml_dequeue()
651 struct aml_data *aml_data = hu->priv; in aml_recv()
654 aml_data->rx_skb = h4_recv_buf(hu->hdev, aml_data->rx_skb, data, count, in aml_recv()
657 if (IS_ERR(aml_data->rx_skb)) { in aml_recv()
658 err = PTR_ERR(aml_data->rx_skb); in aml_recv()
659 bt_dev_err(hu->hdev, "Frame reassembly failed (%d)", err); in aml_recv()
660 aml_data->rx_skb = NULL; in aml_recv()
693 amldev = devm_kzalloc(&serdev->dev, sizeof(*amldev), GFP_KERNEL); in aml_serdev_probe()
695 return -ENOMEM; in aml_serdev_probe()
697 amldev->serdev_hu.serdev = serdev; in aml_serdev_probe()
698 amldev->dev = &serdev->dev; in aml_serdev_probe()
701 err = hci_uart_register_device(&amldev->serdev_hu, &aml_hci_proto); in aml_serdev_probe()
703 return dev_err_probe(amldev->dev, err, in aml_serdev_probe()
706 amldev->aml_dev_data = device_get_match_data(&serdev->dev); in aml_serdev_probe()
715 hci_uart_unregister_device(&amldev->serdev_hu); in aml_serdev_remove()
727 { .compatible = "amlogic,w155s2-bt", .data = &data_w155s2 },
728 { .compatible = "amlogic,w265s2-bt", .data = &data_w265s2 },