| From 62ef0b33b4b3bebc62ba6c997f25fbce67fd295e Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 5 Jun 2020 11:46:09 -0700 |
| Subject: Bluetooth: hci_qca: Only remove TX clock vote after TX is completed |
| |
| From: Matthias Kaehlcke <mka@chromium.org> |
| |
| [ Upstream commit eff981f6579d5797d68d27afc0eede529ac8778a ] |
| |
| qca_suspend() removes the vote for the UART TX clock after |
| writing an IBS sleep request to the serial buffer. This is |
| not a good idea since there is no guarantee that the request |
| has been sent at this point. Instead remove the vote after |
| successfully entering IBS sleep. This also fixes the issue |
| of the vote being removed in case of an aborted suspend due |
| to a failure of entering IBS sleep. |
| |
| Fixes: 41d5b25fed0a0 ("Bluetooth: hci_qca: add PM support") |
| Signed-off-by: Matthias Kaehlcke <mka@chromium.org> |
| Reviewed-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org> |
| Signed-off-by: Marcel Holtmann <marcel@holtmann.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/bluetooth/hci_qca.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c |
| index 568f7ec20b000..dc949592c4ed5 100644 |
| --- a/drivers/bluetooth/hci_qca.c |
| +++ b/drivers/bluetooth/hci_qca.c |
| @@ -2023,8 +2023,6 @@ static int __maybe_unused qca_suspend(struct device *dev) |
| |
| qca->tx_ibs_state = HCI_IBS_TX_ASLEEP; |
| qca->ibs_sent_slps++; |
| - |
| - qca_wq_serial_tx_clock_vote_off(&qca->ws_tx_vote_off); |
| break; |
| |
| case HCI_IBS_TX_ASLEEP: |
| @@ -2052,8 +2050,10 @@ static int __maybe_unused qca_suspend(struct device *dev) |
| qca->rx_ibs_state == HCI_IBS_RX_ASLEEP, |
| msecs_to_jiffies(IBS_BTSOC_TX_IDLE_TIMEOUT_MS)); |
| |
| - if (ret > 0) |
| + if (ret > 0) { |
| + qca_wq_serial_tx_clock_vote_off(&qca->ws_tx_vote_off); |
| return 0; |
| + } |
| |
| if (ret == 0) |
| ret = -ETIMEDOUT; |
| -- |
| 2.25.1 |
| |