Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp1003182yba; Thu, 4 Apr 2019 02:10:50 -0700 (PDT) X-Google-Smtp-Source: APXvYqzudLZr80QpYRpA2na/jHpEo5fBgfQjW+UZs2aGGXxTnRc/835BLRjWPcCqEK4AsrGiCaJ/ X-Received: by 2002:a62:7648:: with SMTP id r69mr4643570pfc.114.1554369050385; Thu, 04 Apr 2019 02:10:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554369050; cv=none; d=google.com; s=arc-20160816; b=ZW8tZ2NQx5VH2S49X4dNqlLVLvlbw6VpHAy0y+BgARrTyLnxzdwFCzdNBvTBjNgayW /Wi8KYKIa+6UDUB+vNpYblp77C/PoeIVrYag4QPaGJhTRHa2g9jRAOMvCXMUGvkRUAJX g+HVj04fBUwn2QgauqahKvyUpu/uw8UfBNoOTr32Du6xrRrwKcrFGAqLdeYiMHXRa1Mu 3kTZTP+qBPj9RiBM48cEaRVDVRECZRQHDLpClKmiLQenOj3LqhjL5NE6jI0pt3Brm+NO rlLnE7p3s2dVe8tGz2/1LcrXE980ajtsmDpSDCtAFKxEVzK3aqH99yEhlHwYmpaTUAGV xKhg== 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:dmarc-filter:dkim-signature:dkim-signature; bh=tfxCx/JJ4MHBSNeUwn3vN+Mlju6cAeB147Bf0+u5aIM=; b=CL3McSMe/CU3YXpg656uPgYdmiByvc2clhlKQJ9jBCrQHrdslLcvCtsCtr8BsXKXYK rNsq+x4pR93eDVEupUB0SIddTi6E75pVJz0gbEEMJVwjbHYbnVijAEGTxn55B/uqB97H Dpfhq3Ni+0eJ6g7f+o3/iY+iHVa/sCOXR008ezFFPSPGo7uCxBAbKQikNz6hCNXmne5X 5rK0Vp67ke20eGGX3u/4HVhFit4D2dxWRBGOVyX7UgCxj7/G1uufFJLMVRQaXNur557q hbiWAahTqWm4TniUJQjopQTGuQISgHYF4sAg0hRjfpEGqrNGxDwEeNrT49gTudkU5l27 DAiw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=OPU+1SiY; dkim=pass header.i=@codeaurora.org header.s=default header.b=J3H7F1qx; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n31si15914021pgm.10.2019.04.04.02.10.35; Thu, 04 Apr 2019 02:10:50 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=OPU+1SiY; dkim=pass header.i=@codeaurora.org header.s=default header.b=J3H7F1qx; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732719AbfDDJIu (ORCPT + 99 others); Thu, 4 Apr 2019 05:08:50 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:47832 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732477AbfDDJIq (ORCPT ); Thu, 4 Apr 2019 05:08:46 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 797FB60CF1; Thu, 4 Apr 2019 09:08:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1554368924; bh=Q5vSFe0gi1nOcjCzZ8kAxSZRJ8wGvK5jkaadBEX+rX0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OPU+1SiYysbaQYNqlmjCiQfC/m1u1sSGzLl2NvKjZKzf/rbr/PYNF7fG4qC8iIkz1 r5G29KxnDyAt/frojbOXbvw0+aXKeKbcQwvHQ7DP6+W/SHPQq1mINLUVUowAMY1Xf2 W1bmPrkgLFfvZ7AErRvHcJS6Os48sQ+bdQQ6rwWY= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_INVALID,DKIM_SIGNED autolearn=no autolearn_force=no version=3.4.0 Received: from rocky-HP-EliteBook-8460p.qca.qualcomm.com (unknown [180.166.53.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: rjliao@codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id BA1D160FED; Thu, 4 Apr 2019 09:08:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1554368921; bh=Q5vSFe0gi1nOcjCzZ8kAxSZRJ8wGvK5jkaadBEX+rX0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=J3H7F1qxROn9spZYzi1JMB4bcO8Wauumu5AJVTKP7/FWVIbsHc7vbtN6n3mgfGtqr vZsNSldL9NypMtxGvL9IMmtDGq6UzCwR56X7zK6eRewn9Hl4JrvQOkZ4iU3ZoYAF4e DD0YDWcpnjoagVaETqVXiKmCiYzPjzZft5VhrJCw= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org BA1D160FED Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=rjliao@codeaurora.org From: Rocky Liao To: marcel@holtmann.org, johan.hedberg@gmail.com Cc: mka@chromium.org, linux-kernel@vger.kernel.org, linux-bluetooth@vger.kernel.org, linux-arm-msm@vger.kernel.org, bgodavar@codeaurora.org, Rocky Liao Subject: [PATCH v2 1/2] Bluetooth: hci_qca: Load customized NVM based on the device property Date: Thu, 4 Apr 2019 17:08:27 +0800 Message-Id: <1554368908-22017-1-git-send-email-rjliao@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1554359858-21049-1-git-send-email-rjliao@codeaurora.org> References: <1554359858-21049-1-git-send-email-rjliao@codeaurora.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org QCA BTSOC nvm is a customized file and different vendor/platoform may want to have different BTSOC configuration via this file (e.g. Configure SCO over PCM or I2S, Setting Tx power, etc.) This patch will allow vendors to download different nvm file by reading a device property "nvm-postfix" as the nvm file name postfix. Signed-off-by: Rocky Liao --- Changes in v2: * added the property to the document file Documentation/devicetree/bindings/net/qualcomm-bluetooth.txt * fixed coding style warnings * moved the nvm-postfix to the last entry of the qca_serdev --- drivers/bluetooth/btqca.c | 14 ++++++++++---- drivers/bluetooth/btqca.h | 6 ++++-- drivers/bluetooth/hci_qca.c | 19 ++++++++++++++++++- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c index 6122685..4e89286 100644 --- a/drivers/bluetooth/btqca.c +++ b/drivers/bluetooth/btqca.c @@ -332,7 +332,8 @@ int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr) EXPORT_SYMBOL_GPL(qca_set_bdaddr_rome); int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, - enum qca_btsoc_type soc_type, u32 soc_ver) + enum qca_btsoc_type soc_type, u32 soc_ver, + const char *nvm_postfix) { struct rome_config config; int err; @@ -368,9 +369,14 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, if (soc_type == QCA_WCN3990) snprintf(config.fwname, sizeof(config.fwname), "qca/crnv%02x.bin", rom_ver); - else - snprintf(config.fwname, sizeof(config.fwname), - "qca/nvm_%08x.bin", soc_ver); + else { + if (nvm_postfix) + snprintf(config.fwname, sizeof(config.fwname), + "qca/nvm_%08x_%s.bin", soc_ver, nvm_postfix); + else + snprintf(config.fwname, sizeof(config.fwname), + "qca/nvm_%08x.bin", soc_ver); + } err = qca_download_firmware(hdev, &config); if (err < 0) { diff --git a/drivers/bluetooth/btqca.h b/drivers/bluetooth/btqca.h index 6fdc25d..0dd6cd0 100644 --- a/drivers/bluetooth/btqca.h +++ b/drivers/bluetooth/btqca.h @@ -139,7 +139,8 @@ enum qca_btsoc_type { int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr); int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, - enum qca_btsoc_type soc_type, u32 soc_ver); + enum qca_btsoc_type soc_type, u32 soc_ver, + const char *nvm_postfix); int qca_read_soc_version(struct hci_dev *hdev, u32 *soc_version); int qca_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr); #else @@ -150,7 +151,8 @@ static inline int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdad } static inline int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, - enum qca_btsoc_type soc_type, u32 soc_ver) + enum qca_btsoc_type soc_type, u32 soc_ver, + const char *nvm_postfix) { return -EOPNOTSUPP; } diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c index 4ea995d..560e880 100644 --- a/drivers/bluetooth/hci_qca.c +++ b/drivers/bluetooth/hci_qca.c @@ -168,6 +168,7 @@ struct qca_serdev { struct qca_power *bt_power; u32 init_speed; u32 oper_speed; + const char *nvm_postfix; }; static int qca_power_setup(struct hci_uart *hu, bool on); @@ -189,6 +190,17 @@ static enum qca_btsoc_type qca_soc_type(struct hci_uart *hu) return soc_type; } +static const char *qca_get_nvm_postfix(struct hci_uart *hu) +{ + if (hu->serdev) { + struct qca_serdev *qsd = serdev_device_get_drvdata(hu->serdev); + + return qsd->nvm_postfix; + } else { + return NULL; + } +} + static void __serial_clock_on(struct tty_struct *tty) { /* TODO: Some chipset requires to enable UART clock on client @@ -1191,6 +1203,7 @@ static int qca_setup(struct hci_uart *hu) struct qca_data *qca = hu->priv; unsigned int speed, qca_baudrate = QCA_BAUDRATE_115200; enum qca_btsoc_type soc_type = qca_soc_type(hu); + const char *nvm_postfix = qca_get_nvm_postfix(hu); int ret; int soc_ver = 0; @@ -1241,7 +1254,8 @@ static int qca_setup(struct hci_uart *hu) bt_dev_info(hdev, "QCA controller version 0x%08x", soc_ver); /* Setup patch / NVM configurations */ - ret = qca_uart_setup(hdev, qca_baudrate, soc_type, soc_ver); + ret = qca_uart_setup(hdev, qca_baudrate, soc_type, soc_ver, + nvm_postfix); if (!ret) { set_bit(STATE_IN_BAND_SLEEP_ENABLED, &qca->flags); qca_debugfs_init(hdev); @@ -1462,6 +1476,9 @@ static int qca_serdev_probe(struct serdev_device *serdev) return PTR_ERR(qcadev->bt_en); } + device_property_read_string(&serdev->dev, "nvm-postfix", + &qcadev->nvm_postfix); + qcadev->susclk = devm_clk_get(&serdev->dev, NULL); if (IS_ERR(qcadev->susclk)) { dev_err(&serdev->dev, "failed to acquire clk\n"); -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project