summaryrefslogtreecommitdiffstats
path: root/drivers/bluetooth
diff options
context:
space:
mode:
authorPhilipp Puschmann <philipp.puschmann@emlix.com>2019-07-02 10:13:37 -0400
committerMarcel Holtmann <marcel@holtmann.org>2019-07-06 06:29:25 -0400
commita2e02f38eff84f199c8e32359eb213f81f270047 (patch)
tree3623b0624f216adc9e513bee576a945e0a01029c /drivers/bluetooth
parent98d9856a759f5cc8032efeb5c87badc1c652d430 (diff)
Bluetooth: hci_ll: set operational frequency earlier
Uploading the firmware needs quite a few seconds if done at 115200 kbps. So set the operational frequency, usually 3 MHz, before uploading the firmware. I have successfully tested this with a wl1837mod. Signed-off-by: Philipp Puschmann <philipp.puschmann@emlix.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'drivers/bluetooth')
-rw-r--r--drivers/bluetooth/hci_ll.c39
1 files changed, 21 insertions, 18 deletions
diff --git a/drivers/bluetooth/hci_ll.c b/drivers/bluetooth/hci_ll.c
index c04f5f9e1ed0..cbd7bc539d5e 100644
--- a/drivers/bluetooth/hci_ll.c
+++ b/drivers/bluetooth/hci_ll.c
@@ -601,6 +601,13 @@ static int ll_setup(struct hci_uart *hu)
601 601
602 serdev_device_set_flow_control(serdev, true); 602 serdev_device_set_flow_control(serdev, true);
603 603
604 if (hu->oper_speed)
605 speed = hu->oper_speed;
606 else if (hu->proto->oper_speed)
607 speed = hu->proto->oper_speed;
608 else
609 speed = 0;
610
604 do { 611 do {
605 /* Reset the Bluetooth device */ 612 /* Reset the Bluetooth device */
606 gpiod_set_value_cansleep(lldev->enable_gpio, 0); 613 gpiod_set_value_cansleep(lldev->enable_gpio, 0);
@@ -612,6 +619,20 @@ static int ll_setup(struct hci_uart *hu)
612 return err; 619 return err;
613 } 620 }
614 621
622 if (speed) {
623 __le32 speed_le = cpu_to_le32(speed);
624 struct sk_buff *skb;
625
626 skb = __hci_cmd_sync(hu->hdev,
627 HCI_VS_UPDATE_UART_HCI_BAUDRATE,
628 sizeof(speed_le), &speed_le,
629 HCI_INIT_TIMEOUT);
630 if (!IS_ERR(skb)) {
631 kfree_skb(skb);
632 serdev_device_set_baudrate(serdev, speed);
633 }
634 }
635
615 err = download_firmware(lldev); 636 err = download_firmware(lldev);
616 if (!err) 637 if (!err)
617 break; 638 break;
@@ -636,25 +657,7 @@ static int ll_setup(struct hci_uart *hu)
636 } 657 }
637 658
638 /* Operational speed if any */ 659 /* Operational speed if any */
639 if (hu->oper_speed)
640 speed = hu->oper_speed;
641 else if (hu->proto->oper_speed)
642 speed = hu->proto->oper_speed;
643 else
644 speed = 0;
645
646 if (speed) {
647 __le32 speed_le = cpu_to_le32(speed);
648 struct sk_buff *skb;
649 660
650 skb = __hci_cmd_sync(hu->hdev, HCI_VS_UPDATE_UART_HCI_BAUDRATE,
651 sizeof(speed_le), &speed_le,
652 HCI_INIT_TIMEOUT);
653 if (!IS_ERR(skb)) {
654 kfree_skb(skb);
655 serdev_device_set_baudrate(serdev, speed);
656 }
657 }
658 661
659 return 0; 662 return 0;
660} 663}