Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp7858801ybi; Thu, 6 Jun 2019 02:41:40 -0700 (PDT) X-Google-Smtp-Source: APXvYqx+U2uju76sZ/LVIrJqKmYjfTjYR4Eng5igX/zw8UHl67mThDBg1i9boiQgvD2JOgT/86jz X-Received: by 2002:a62:1a8e:: with SMTP id a136mr14681406pfa.22.1559814100819; Thu, 06 Jun 2019 02:41:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559814100; cv=none; d=google.com; s=arc-20160816; b=jeWkmBYVZ5nrPfmzAndk6uzomC1pcJOG91xgky12x0auRNs1jHeXZth2vMWfbu36sO bcC+Az2+t4q4nRDcrAVJNPqcDLKzt/ujRDLwrkh82sEwzFuVVRgXaTG5dnpsyAXOjDhc WlSQaI1rQSJ4xvr2sNWOBtiWx0/oyARPXv91qo098dsun+KVv45Uzg7PRjYxJ7U7Sd4N SL4RY4mN3mJVWJvUCYFYrG7MH1ojYazwq3pcn/7LaGPAspuumDNJeQgGFXkk+AP2fuYr 4zyR8gkoyijYKRnrf2Cc6S9znmFrrip4lVTpkMQDvL6zKemc6ZvSeQMfhxinGKM5Hpg1 aAMg== 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=xR7Memrh1Eg1cHr8Q1qrTwHaJm2UVLKweZnsBUDpDZ8=; b=LglNI+R0dmGHXz8jLPPc/eRXyYW2rZ5RehFHmrYgfF2T1GMbVfxfoJf8hvOImLhJWF caQpmxHfdl0ecMJsyAFUv6vk+D6E18qc5R9J5WxFLLAqNltuIpPytrTMffc501sYsPdZ UkCG7fZk1OaWht7egBhqrcHZyxs9gbvBo8nE8pLYSDD2IHfLFPgcD5zMit0GXxdEkTI1 PTQnNuGzONDHbP33B5XeDyDawY3P9cOAvhmfWpBQmm2MqM6FaxXkPlDsBiw/8D5RrKCO 3L+n4jP/WleqlqCh678RSHLFYBF1SZ0ejI5AKve/iu570Bu+oKkRBS4xX4+2692B+4hh hCXg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=KyuiZ5xR; dkim=pass header.i=@codeaurora.org header.s=default header.b=mcN0LhTU; spf=pass (google.com: best guess record for domain of linux-bluetooth-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-bluetooth-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 c83si1448669pfc.246.2019.06.06.02.41.13; Thu, 06 Jun 2019 02:41:40 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-bluetooth-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=KyuiZ5xR; dkim=pass header.i=@codeaurora.org header.s=default header.b=mcN0LhTU; spf=pass (google.com: best guess record for domain of linux-bluetooth-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727748AbfFFJkm (ORCPT + 99 others); Thu, 6 Jun 2019 05:40:42 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:54536 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727359AbfFFJkm (ORCPT ); Thu, 6 Jun 2019 05:40:42 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id A85A260255; Thu, 6 Jun 2019 09:40:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1559814040; bh=rU0t5RwiWywQmmpKFOVVHDpMxEFOcbC7Tl57m2Sd1TQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KyuiZ5xRgJDS/p/VT/bIem9IZCtN6GKm+aFqiRTFygSTy4AaNeapiV1RKUm+EUb4i 7naYLW5hqm/KlPRl2C+mtYGVYYDPm4S64shIEW3BvRFAoiP4aGVP5BHQBce0Cbz5Ny Tbf2hMOuDiC7Mp2o0KkoHI6KDbgwB1j53C8IiNH4= 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,SPF_NONE autolearn=no autolearn_force=no version=3.4.0 Received: from rocky-HP-EliteBook-8460p.wlan.qualcomm.com (tpe-colo-wan-fw-bordernet.qualcomm.com [103.229.16.4]) (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 5FCCD60850; Thu, 6 Jun 2019 09:40:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1559814039; bh=rU0t5RwiWywQmmpKFOVVHDpMxEFOcbC7Tl57m2Sd1TQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mcN0LhTU2ZJcitqVqgU6eio1E6DbzWelfbTBMemyU1TMquYeGV9/01j1dhhZPNkX2 vy1qkH6CvEmZtS7LZlN5NSVD7AjTVwGSuPY5cd8pZR+hzd0fiXeyb3pQSXP/P7b3xc 2KQ10gaydNRSKSEODQ0nH3Zj6i3ESlncuTpp8EbA= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 5FCCD60850 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: robh+dt@kernel.org, mark.rutland@arm.com, marcel@holtmann.org, johan.hedberg@gmail.com, thierry.escande@linaro.org Cc: netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-bluetooth@vger.kernel.org, linux-arm-msm@vger.kernel.org, bgodavar@codeaurora.org, c-hbandi@codeaurora.org, Rocky Liao Subject: [PATCH v6 1/2] Bluetooth: hci_qca: Load customized NVM based on the device property Date: Thu, 6 Jun 2019 17:40:30 +0800 Message-Id: <1559814030-13833-1-git-send-email-rjliao@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1557919161-11010-1-git-send-email-rjliao@codeaurora.org> References: <1557919161-11010-1-git-send-email-rjliao@codeaurora.org> Sender: linux-bluetooth-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org QCA BTSOC NVM is a customized firmware file and different vendors may want to have different BTSOC configuration (e.g. Configure SCO over PCM or I2S, Setting Tx power, etc.) via this file. This patch will allow vendors to download different NVM firmware file by reading a device property "firmware-name". Signed-off-by: Rocky Liao --- Changes in v6: * Added read firmware-name property for both QCA6174 and WCN399X --- drivers/bluetooth/btqca.c | 8 ++++++-- drivers/bluetooth/btqca.h | 6 ++++-- drivers/bluetooth/hci_qca.c | 18 +++++++++++++++++- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c index cc12eec..a78b80e 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 *firmware_name) { struct rome_config config; int err; @@ -365,7 +366,10 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, /* Download NVM configuration */ config.type = TLV_TYPE_NVM; - if (qca_is_wcn399x(soc_type)) + if (firmware_name) + snprintf(config.fwname, sizeof(config.fwname), + "qca/%s", firmware_name); + else if (qca_is_wcn399x(soc_type)) snprintf(config.fwname, sizeof(config.fwname), "qca/crnv%02x.bin", rom_ver); else diff --git a/drivers/bluetooth/btqca.h b/drivers/bluetooth/btqca.h index 4c4fe2b..8c037bb 100644 --- a/drivers/bluetooth/btqca.h +++ b/drivers/bluetooth/btqca.h @@ -140,7 +140,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 *firmware_name); int qca_read_soc_version(struct hci_dev *hdev, u32 *soc_version); int qca_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr); static inline bool qca_is_wcn399x(enum qca_btsoc_type soc_type) @@ -155,7 +156,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 *firmware_name) { return -EOPNOTSUPP; } diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c index 57322c4..05ee0a1 100644 --- a/drivers/bluetooth/hci_qca.c +++ b/drivers/bluetooth/hci_qca.c @@ -169,6 +169,7 @@ struct qca_serdev { struct qca_power *bt_power; u32 init_speed; u32 oper_speed; + const char *firmware_name; }; static int qca_power_setup(struct hci_uart *hu, bool on); @@ -190,6 +191,17 @@ static enum qca_btsoc_type qca_soc_type(struct hci_uart *hu) return soc_type; } +static const char *qca_get_firmware_name(struct hci_uart *hu) +{ + if (hu->serdev) { + struct qca_serdev *qsd = serdev_device_get_drvdata(hu->serdev); + + return qsd->firmware_name; + } else { + return NULL; + } +} + static void __serial_clock_on(struct tty_struct *tty) { /* TODO: Some chipset requires to enable UART clock on client @@ -1195,6 +1207,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 *firmware_name = qca_get_firmware_name(hu); int ret; int soc_ver = 0; @@ -1245,7 +1258,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, + firmware_name); if (!ret) { set_bit(QCA_IBS_ENABLED, &qca->flags); qca_debugfs_init(hdev); @@ -1439,6 +1453,8 @@ static int qca_serdev_probe(struct serdev_device *serdev) qcadev->serdev_hu.serdev = serdev; data = of_device_get_match_data(&serdev->dev); serdev_device_set_drvdata(serdev, qcadev); + device_property_read_string(&serdev->dev, "firmware-name", + &qcadev->firmware_name); if (data && qca_is_wcn399x(data->soc_type)) { qcadev->btsoc_type = data->soc_type; qcadev->bt_power = devm_kzalloc(&serdev->dev, -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project