summaryrefslogtreecommitdiffstats
path: root/drivers/bluetooth
diff options
context:
space:
mode:
authorVyacheslav Bocharov <adeep@lexina.in>2022-01-26 08:39:05 +0100
committerMarcel Holtmann <marcel@holtmann.org>2022-01-26 14:39:35 +0100
commitadce573b927adf827f2f8627f05c2ba90031ebc9 (patch)
treef57f7cd60c8ac88e1b186d1cabddde1b8a259e30 /drivers/bluetooth
parentBluetooth: btrtl: Add support for RTL8822C hci_ver 0x08 (diff)
downloadlinux-adce573b927adf827f2f8627f05c2ba90031ebc9.tar.xz
linux-adce573b927adf827f2f8627f05c2ba90031ebc9.zip
Bluetooth: hci_h5: Add power reset via gpio in h5_btrtl_open
Add power reset for bluetooth via enable-gpios in h5_btrtl_open function. While testing the RTL8822CS SDIO WiFi/BT adapter, it was found that in some cases the kernel could not initialize BT firmware. However, manually resetting the adapter via gpio (off/on sequence) allows it to start correctly. Apparently, when the system starts, the adapter is in an undefined state (including unknown gpio state after starting uboot). A forced reset helps to initialize the adapter in most cases. It has been found experimentally that 100 ms is sufficient for a reset. Signed-off-by: Vyacheslav Bocharov <adeep@lexina.in> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'drivers/bluetooth')
-rw-r--r--drivers/bluetooth/hci_h5.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/bluetooth/hci_h5.c b/drivers/bluetooth/hci_h5.c
index 34286ffe0568..fdf504b0d265 100644
--- a/drivers/bluetooth/hci_h5.c
+++ b/drivers/bluetooth/hci_h5.c
@@ -966,6 +966,11 @@ static void h5_btrtl_open(struct h5 *h5)
pm_runtime_enable(&h5->hu->serdev->dev);
}
+ /* The controller needs reset to startup */
+ gpiod_set_value_cansleep(h5->enable_gpio, 0);
+ gpiod_set_value_cansleep(h5->device_wake_gpio, 0);
+ msleep(100);
+
/* The controller needs up to 500ms to wakeup */
gpiod_set_value_cansleep(h5->enable_gpio, 1);
gpiod_set_value_cansleep(h5->device_wake_gpio, 1);