Bluetooth: hci_qca: Add QCA Rome power off support to the qca_power_shutdown()

Current qca_power_shutdown() only supports wcn399x, this patch adds Rome
power off support to it. For Rome it just needs to pull down the bt_en
GPIO to power off it. This patch also replaces all the power off operation
in qca_close() with the unified qca_power_shutdown() call.

Signed-off-by: Rocky Liao <rjliao@codeaurora.org>
Reviewed-by: Matthias Kaehlcke <mka@chromium.org>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
Rocky Liao 2020-01-15 16:55:50 +08:00 коммит произвёл Marcel Holtmann
Родитель f25a96c8eb
Коммит 5559904ccc
1 изменённых файлов: 16 добавлений и 12 удалений

Просмотреть файл

@ -663,7 +663,6 @@ static int qca_flush(struct hci_uart *hu)
/* Close protocol */ /* Close protocol */
static int qca_close(struct hci_uart *hu) static int qca_close(struct hci_uart *hu)
{ {
struct qca_serdev *qcadev;
struct qca_data *qca = hu->priv; struct qca_data *qca = hu->priv;
BT_DBG("hu %p qca close", hu); BT_DBG("hu %p qca close", hu);
@ -679,14 +678,7 @@ static int qca_close(struct hci_uart *hu)
destroy_workqueue(qca->workqueue); destroy_workqueue(qca->workqueue);
qca->hu = NULL; qca->hu = NULL;
if (hu->serdev) {
qcadev = serdev_device_get_drvdata(hu->serdev);
if (qca_is_wcn399x(qcadev->btsoc_type))
qca_power_shutdown(hu); qca_power_shutdown(hu);
else
gpiod_set_value_cansleep(qcadev->bt_en, 0);
}
kfree_skb(qca->rx_skb); kfree_skb(qca->rx_skb);
@ -1685,6 +1677,7 @@ static void qca_power_shutdown(struct hci_uart *hu)
struct qca_serdev *qcadev; struct qca_serdev *qcadev;
struct qca_data *qca = hu->priv; struct qca_data *qca = hu->priv;
unsigned long flags; unsigned long flags;
enum qca_btsoc_type soc_type = qca_soc_type(hu);
qcadev = serdev_device_get_drvdata(hu->serdev); qcadev = serdev_device_get_drvdata(hu->serdev);
@ -1697,11 +1690,22 @@ static void qca_power_shutdown(struct hci_uart *hu)
qca_flush(hu); qca_flush(hu);
spin_unlock_irqrestore(&qca->hci_ibs_lock, flags); spin_unlock_irqrestore(&qca->hci_ibs_lock, flags);
hu->hdev->hw_error = NULL;
hu->hdev->cmd_timeout = NULL;
/* Non-serdev device usually is powered by external power
* and don't need additional action in driver for power down
*/
if (!hu->serdev)
return;
if (qca_is_wcn399x(soc_type)) {
host_set_baudrate(hu, 2400); host_set_baudrate(hu, 2400);
qca_send_power_pulse(hu, false); qca_send_power_pulse(hu, false);
qca_regulator_disable(qcadev); qca_regulator_disable(qcadev);
hu->hdev->hw_error = NULL; } else {
hu->hdev->cmd_timeout = NULL; gpiod_set_value_cansleep(qcadev->bt_en, 0);
}
} }
static int qca_power_off(struct hci_dev *hdev) static int qca_power_off(struct hci_dev *hdev)