Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp1771151pxk; Tue, 1 Sep 2020 07:26:39 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwWxX4b01OIpcdH7w8D372obCkneI+rzSyfkMj3IX9FW7iV7tr/jAyAY/VjrNDJox0A5SPN X-Received: by 2002:a17:907:10db:: with SMTP id rv27mr1629135ejb.223.1598970399647; Tue, 01 Sep 2020 07:26:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598970399; cv=none; d=google.com; s=arc-20160816; b=Q/rQAvoABe2oJm8xLFUDxMRS+V9iExK82XhkijgAiLw9rLTHVFN3o5yc9G8J0Tv1pt k9D2oASTFOo0aN0hJHLzlY3AASookYGS7BFwxwqg1RqDOtlaVmN2EDE2plU3u4FRLmt4 /NdnzXnqDaANROHfgkbhgw1YN3B4sbpPb/vMimN7jxqWCVZ6sNvMsPCg4HjmldUYtGvl WLkGz4/YOVzc+ddfOkCjlctshPWLNdvoEl24hmaCX24gAPlwHcMAfE+WnDsPeCcrOequ ndrcyjY2ftdJ2ecMDGqFTpTImF58q0A5JgMrc8aNSZ8Kj4jIrF/lGXxQ4bU6i3GYCT5F 5LcA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=pRgA2rQ7+dbPDaPMX1xncofTtsHviK/eaVO9nI3fkAE=; b=Xq3rKYu5kgrsbtv9Ek7iIi4fuIavWidoyeLFNisqZHINj7yE4N34qTJ1qeN5Rligbp w+PZg6Djytsy2x7y7S1qZcxHoHQX7Dx4aWikL4ypRPoEzzSKALFKLIAqRC44huJGFAaU nr9D7LdRMRhK+6JJ6/7uwuYzev3NT+zd7ff5RVxTv7NB3xMLdeqEzU/R2h7HUyK+eGsN 6sd6RjGi7GaYMCmFAx/IzlfXpsjwMRDi7OABBIsu5w6WR3zILURS6yCfh/RtElUoNtxW 1PoI4uZceBDt9xBs4/LJlKFUo/bVvFVC7tV7Ztg/vdIJ5i6pa1rIwP8C/Wg1+HpWmsQH J6yg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a23si790249eju.364.2020.09.01.07.26.12; Tue, 01 Sep 2020 07:26:39 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727910AbgIAOZw (ORCPT + 99 others); Tue, 1 Sep 2020 10:25:52 -0400 Received: from alexa-out.qualcomm.com ([129.46.98.28]:49591 "EHLO alexa-out.qualcomm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728060AbgIAOZJ (ORCPT ); Tue, 1 Sep 2020 10:25:09 -0400 Received: from ironmsg08-lv.qualcomm.com ([10.47.202.152]) by alexa-out.qualcomm.com with ESMTP; 01 Sep 2020 07:24:59 -0700 Received: from ironmsg02-blr.qualcomm.com ([10.86.208.131]) by ironmsg08-lv.qualcomm.com with ESMTP/TLS/AES256-SHA; 01 Sep 2020 07:24:57 -0700 Received: from gubbaven-linux.qualcomm.com ([10.206.64.32]) by ironmsg02-blr.qualcomm.com with ESMTP; 01 Sep 2020 19:54:32 +0530 Received: by gubbaven-linux.qualcomm.com (Postfix, from userid 2365015) id E3F8E217CB; Tue, 1 Sep 2020 19:54:30 +0530 (IST) From: Venkata Lakshmi Narayana Gubba To: marcel@holtmann.org, johan.hedberg@gmail.com Cc: mka@chromium.org, linux-kernel@vger.kernel.org, linux-bluetooth@vger.kernel.org, hemantg@codeaurora.org, linux-arm-msm@vger.kernel.org, bgodavar@codeaurora.org, rjliao@codeaurora.org, hbandi@codeaurora.org, abhishekpandit@chromium.org, Venkata Lakshmi Narayana Gubba Subject: [PATCH v1 1/2] Bluetooth: hci_serdev: Close UART port if NON_PERSISTENT_SETUP is set Date: Tue, 1 Sep 2020 19:54:26 +0530 Message-Id: <1598970267-7170-2-git-send-email-gubbaven@codeaurora.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1598970267-7170-1-git-send-email-gubbaven@codeaurora.org> References: <1598970267-7170-1-git-send-email-gubbaven@codeaurora.org> Sender: linux-bluetooth-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org When HCI_QUIRK_NON_PERSISTENT_SETUP is set by drivers, it indicates that BT SoC will be completely powered OFF during BT OFF. On next BT ON firmware must be downloaded again. Holding UART port open during BT OFF is draining the battery. Now during BT OFF, UART port is closed if qurik HCI_QUIRK_NON_PERSISTENT_SETUP is set by clearing HCI_UART_PROTO_READY proto flag. On next BT ON, UART port is opened if HCI_UART_PROTO_READY proto flag is cleared. Signed-off-by: Venkata Lakshmi Narayana Gubba --- drivers/bluetooth/hci_serdev.c | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/drivers/bluetooth/hci_serdev.c b/drivers/bluetooth/hci_serdev.c index 3977bba..ef96ad0 100644 --- a/drivers/bluetooth/hci_serdev.c +++ b/drivers/bluetooth/hci_serdev.c @@ -113,8 +113,22 @@ static int hci_uart_flush(struct hci_dev *hdev) /* Initialize device */ static int hci_uart_open(struct hci_dev *hdev) { + struct hci_uart *hu = hci_get_drvdata(hdev); + int err; + BT_DBG("%s %p", hdev->name, hdev); + /* When Quirk HCI_QUIRK_NON_PERSISTENT_SETUP is set by + * driver, BT SoC is completely turned OFF during + * BT OFF. Upon next BT ON UART port should be opened. + */ + if (!test_bit(HCI_UART_PROTO_READY, &hu->flags)) { + err = serdev_device_open(hu->serdev); + if (err) + return err; + set_bit(HCI_UART_PROTO_READY, &hu->flags); + } + /* Undo clearing this from hci_uart_close() */ hdev->flush = hci_uart_flush; @@ -124,11 +138,25 @@ static int hci_uart_open(struct hci_dev *hdev) /* Close device */ static int hci_uart_close(struct hci_dev *hdev) { + struct hci_uart *hu = hci_get_drvdata(hdev); + BT_DBG("hdev %p", hdev); + if (!test_bit(HCI_UART_PROTO_READY, &hu->flags)) + return 0; + hci_uart_flush(hdev); hdev->flush = NULL; + /* When QUIRK HCI_QUIRK_NON_PERSISTENT_SETUP is set by driver, + * BT SOC is completely powered OFF during BT OFF, holding port + * open may drain the battery. + */ + if (test_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks)) { + clear_bit(HCI_UART_PROTO_READY, &hu->flags); + serdev_device_close(hu->serdev); + } + return 0; } @@ -354,8 +382,6 @@ void hci_uart_unregister_device(struct hci_uart *hu) { struct hci_dev *hdev = hu->hdev; - clear_bit(HCI_UART_PROTO_READY, &hu->flags); - cancel_work_sync(&hu->init_ready); if (test_bit(HCI_UART_REGISTERED, &hu->flags)) hci_unregister_dev(hdev); @@ -364,6 +390,10 @@ void hci_uart_unregister_device(struct hci_uart *hu) cancel_work_sync(&hu->write_work); hu->proto->close(hu); - serdev_device_close(hu->serdev); + + if (test_bit(HCI_UART_PROTO_READY, &hu->flags)) { + clear_bit(HCI_UART_PROTO_READY, &hu->flags); + serdev_device_close(hu->serdev); + } } EXPORT_SYMBOL_GPL(hci_uart_unregister_device); -- QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation