linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] bluetooth: qca: enable WCN7850 support
@ 2023-06-20 15:19 Neil Armstrong
  2023-06-20 15:19 ` [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset Neil Armstrong
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Neil Armstrong @ 2023-06-20 15:19 UTC (permalink / raw)
  To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Balakrishna Godavarthi, Rocky Liao, Marcel Holtmann,
	Johan Hedberg, Luiz Augusto von Dentz, Andy Gross,
	Bjorn Andersson, Konrad Dybcio
  Cc: netdev, devicetree, linux-kernel, linux-bluetooth, linux-arm-msm,
	Neil Armstrong

This serie enables WCN7850 on the Qualcomm SM8550 QRD
reference platform.

The WCN7850 is close to the WCN6855 but uses different
firmware names.

Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
---
Neil Armstrong (4):
      dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset
      bluetooth: qca: add support for WCN7850
      arm64: dts: qcom: sm8550: add UART14 nodes
      arm64: dts: qcom: sm8550-qrd: add bluetooth support

 .../bindings/net/bluetooth/qualcomm-bluetooth.yaml | 23 +++++++++++
 arch/arm64/boot/dts/qcom/sm8550-qrd.dts            | 43 +++++++++++++++++++
 arch/arm64/boot/dts/qcom/sm8550.dtsi               | 30 ++++++++++++++
 drivers/bluetooth/btqca.c                          |  7 ++++
 drivers/bluetooth/btqca.h                          | 10 +++++
 drivers/bluetooth/hci_qca.c                        | 48 +++++++++++++++++-----
 6 files changed, 150 insertions(+), 11 deletions(-)
---
base-commit: 9dbf40840551df336c95ce2a3adbdd25ed53c0ef
change-id: 20230620-topic-sm8550-upstream-bt-dfc4305f9c14

Best regards,
-- 
Neil Armstrong <neil.armstrong@linaro.org>


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset
  2023-06-20 15:19 [PATCH 0/4] bluetooth: qca: enable WCN7850 support Neil Armstrong
@ 2023-06-20 15:19 ` Neil Armstrong
  2023-06-20 15:37   ` bluetooth: qca: enable WCN7850 support bluez.test.bot
  2023-06-22  1:54   ` [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset Rob Herring
  2023-06-20 15:19 ` [PATCH 2/4] bluetooth: qca: add support for WCN7850 Neil Armstrong
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 10+ messages in thread
From: Neil Armstrong @ 2023-06-20 15:19 UTC (permalink / raw)
  To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Balakrishna Godavarthi, Rocky Liao, Marcel Holtmann,
	Johan Hedberg, Luiz Augusto von Dentz, Andy Gross,
	Bjorn Andersson, Konrad Dybcio
  Cc: netdev, devicetree, linux-kernel, linux-bluetooth, linux-arm-msm,
	Neil Armstrong

Document the WCN7850 Bluetooth chipset.

Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
---
 .../bindings/net/bluetooth/qualcomm-bluetooth.yaml | 23 ++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml b/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml
index 28296b6d35b2..abc81d0a706e 100644
--- a/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml
+++ b/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml
@@ -25,6 +25,7 @@ properties:
       - qcom,qca6390-bt
       - qcom,wcn6750-bt
       - qcom,wcn6855-bt
+      - qcom,wcn7850-bt
 
   enable-gpios:
     maxItems: 1
@@ -54,6 +55,9 @@ properties:
   vddaon-supply:
     description: VDD_AON supply regulator handle
 
+  vdddig-supply:
+    description: VDD_DIG supply regulator handle
+
   vddbtcxmx-supply:
     description: VDD_BT_CXMX supply regulator handle
 
@@ -69,6 +73,9 @@ properties:
   vddrfa1p2-supply:
     description: VDD_RFA_1P2 supply regulator handle
 
+  vddrfa1p9-supply:
+    description: VDD_RFA_1P9 supply regulator handle
+
   vddrfa2p2-supply:
     description: VDD_RFA_2P2 supply regulator handle
 
@@ -152,6 +159,22 @@ allOf:
         - vddrfa0p8-supply
         - vddrfa1p2-supply
         - vddrfa1p7-supply
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - qcom,wcn7850-bt
+    then:
+      required:
+        - enable-gpios
+        - swctrl-gpios
+        - vddio-supply
+        - vddaon-supply
+        - vdddig-supply
+        - vddrfa0p8-supply
+        - vddrfa1p2-supply
+        - vddrfa1p9-supply
 
 examples:
   - |

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/4] bluetooth: qca: add support for WCN7850
  2023-06-20 15:19 [PATCH 0/4] bluetooth: qca: enable WCN7850 support Neil Armstrong
  2023-06-20 15:19 ` [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset Neil Armstrong
@ 2023-06-20 15:19 ` Neil Armstrong
  2023-06-20 15:43   ` Konrad Dybcio
  2023-06-20 15:19 ` [PATCH 3/4] arm64: dts: qcom: sm8550: add UART14 nodes Neil Armstrong
  2023-06-20 15:19 ` [PATCH 4/4] arm64: dts: qcom: sm8550-qrd: add bluetooth support Neil Armstrong
  3 siblings, 1 reply; 10+ messages in thread
From: Neil Armstrong @ 2023-06-20 15:19 UTC (permalink / raw)
  To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Balakrishna Godavarthi, Rocky Liao, Marcel Holtmann,
	Johan Hedberg, Luiz Augusto von Dentz, Andy Gross,
	Bjorn Andersson, Konrad Dybcio
  Cc: netdev, devicetree, linux-kernel, linux-bluetooth, linux-arm-msm,
	Neil Armstrong

Add support for the WCN7850 Bluetooth chipset.

Tested on the SM8550 QRD platform.

Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
---
 drivers/bluetooth/btqca.c   |  7 +++++++
 drivers/bluetooth/btqca.h   | 10 ++++++++++
 drivers/bluetooth/hci_qca.c | 48 ++++++++++++++++++++++++++++++++++-----------
 3 files changed, 54 insertions(+), 11 deletions(-)

diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c
index e7e58a956d15..037146b476ff 100644
--- a/drivers/bluetooth/btqca.c
+++ b/drivers/bluetooth/btqca.c
@@ -617,6 +617,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
 	} else if (soc_type == QCA_WCN6855) {
 		snprintf(config.fwname, sizeof(config.fwname),
 			 "qca/hpbtfw%02x.tlv", rom_ver);
+	} else if (soc_type == QCA_WCN7850) {
+		snprintf(config.fwname, sizeof(config.fwname),
+			 "qca/hmtbtfw%02x.tlv", rom_ver);
 	} else {
 		snprintf(config.fwname, sizeof(config.fwname),
 			 "qca/rampatch_%08x.bin", soc_ver);
@@ -654,6 +657,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
 	else if (soc_type == QCA_WCN6855)
 		snprintf(config.fwname, sizeof(config.fwname),
 			 "qca/hpnv%02x.bin", rom_ver);
+	else if (soc_type == QCA_WCN7850)
+		snprintf(config.fwname, sizeof(config.fwname),
+			 "qca/hmtnv%02x.bin", rom_ver);
 	else
 		snprintf(config.fwname, sizeof(config.fwname),
 			 "qca/nvm_%08x.bin", soc_ver);
@@ -695,6 +701,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
 	case QCA_WCN3991:
 	case QCA_WCN6750:
 	case QCA_WCN6855:
+	case QCA_WCN7850:
 		/* get fw build info */
 		err = qca_read_fw_build_info(hdev);
 		if (err < 0)
diff --git a/drivers/bluetooth/btqca.h b/drivers/bluetooth/btqca.h
index b884095bcd9d..ff1850e984fe 100644
--- a/drivers/bluetooth/btqca.h
+++ b/drivers/bluetooth/btqca.h
@@ -148,6 +148,7 @@ enum qca_btsoc_type {
 	QCA_QCA6390,
 	QCA_WCN6750,
 	QCA_WCN6855,
+	QCA_WCN7850,
 };
 
 #if IS_ENABLED(CONFIG_BT_QCA)
@@ -173,6 +174,10 @@ static inline bool qca_is_wcn6855(enum qca_btsoc_type soc_type)
 {
 	return soc_type == QCA_WCN6855;
 }
+static inline bool qca_is_wcn7850(enum qca_btsoc_type soc_type)
+{
+	return soc_type == QCA_WCN7850;
+}
 
 #else
 
@@ -216,6 +221,11 @@ static inline bool qca_is_wcn6855(enum qca_btsoc_type soc_type)
 	return false;
 }
 
+static inline bool qca_is_wcn7850(enum qca_btsoc_type soc_type)
+{
+	return false;
+}
+
 static inline int qca_send_pre_shutdown_cmd(struct hci_dev *hdev)
 {
 	return -EOPNOTSUPP;
diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
index e30c979535b1..49b8d75d271e 100644
--- a/drivers/bluetooth/hci_qca.c
+++ b/drivers/bluetooth/hci_qca.c
@@ -1322,7 +1322,8 @@ static int qca_set_baudrate(struct hci_dev *hdev, uint8_t baudrate)
 	/* Give the controller time to process the request */
 	if (qca_is_wcn399x(qca_soc_type(hu)) ||
 	    qca_is_wcn6750(qca_soc_type(hu)) ||
-	    qca_is_wcn6855(qca_soc_type(hu)))
+	    qca_is_wcn6855(qca_soc_type(hu)) ||
+	    qca_is_wcn7850(qca_soc_type(hu)))
 		usleep_range(1000, 10000);
 	else
 		msleep(300);
@@ -1400,7 +1401,8 @@ static int qca_check_speeds(struct hci_uart *hu)
 {
 	if (qca_is_wcn399x(qca_soc_type(hu)) ||
 	    qca_is_wcn6750(qca_soc_type(hu)) ||
-	    qca_is_wcn6855(qca_soc_type(hu))) {
+	    qca_is_wcn6855(qca_soc_type(hu)) ||
+	    qca_is_wcn7850(qca_soc_type(hu))) {
 		if (!qca_get_speed(hu, QCA_INIT_SPEED) &&
 		    !qca_get_speed(hu, QCA_OPER_SPEED))
 			return -EINVAL;
@@ -1435,7 +1437,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type)
 		 */
 		if (qca_is_wcn399x(soc_type) ||
 		    qca_is_wcn6750(soc_type) ||
-		    qca_is_wcn6855(soc_type))
+		    qca_is_wcn6855(soc_type) ||
+		    qca_is_wcn7850(soc_type))
 			hci_uart_set_flow_control(hu, true);
 
 		if (soc_type == QCA_WCN3990) {
@@ -1454,7 +1457,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type)
 error:
 		if (qca_is_wcn399x(soc_type) ||
 		    qca_is_wcn6750(soc_type) ||
-		    qca_is_wcn6855(soc_type))
+		    qca_is_wcn6855(soc_type) ||
+		    qca_is_wcn7850(soc_type))
 			hci_uart_set_flow_control(hu, false);
 
 		if (soc_type == QCA_WCN3990) {
@@ -1691,7 +1695,8 @@ static int qca_power_on(struct hci_dev *hdev)
 
 	if (qca_is_wcn399x(soc_type) ||
 	    qca_is_wcn6750(soc_type) ||
-	    qca_is_wcn6855(soc_type)) {
+	    qca_is_wcn6855(soc_type) ||
+	    qca_is_wcn7850(soc_type)) {
 		ret = qca_regulator_init(hu);
 	} else {
 		qcadev = serdev_device_get_drvdata(hu->serdev);
@@ -1733,7 +1738,8 @@ static int qca_setup(struct hci_uart *hu)
 	bt_dev_info(hdev, "setting up %s",
 		qca_is_wcn399x(soc_type) ? "wcn399x" :
 		(soc_type == QCA_WCN6750) ? "wcn6750" :
-		(soc_type == QCA_WCN6855) ? "wcn6855" : "ROME/QCA6390");
+		(soc_type == QCA_WCN6855) ? "wcn6855" :
+		(soc_type == QCA_WCN7850) ? "wcn7850" : "ROME/QCA6390");
 
 	qca->memdump_state = QCA_MEMDUMP_IDLE;
 
@@ -1746,7 +1752,8 @@ static int qca_setup(struct hci_uart *hu)
 
 	if (qca_is_wcn399x(soc_type) ||
 	    qca_is_wcn6750(soc_type) ||
-	    qca_is_wcn6855(soc_type)) {
+	    qca_is_wcn6855(soc_type) ||
+	    qca_is_wcn7850(soc_type)) {
 		set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks);
 		hci_set_aosp_capable(hdev);
 
@@ -1769,7 +1776,8 @@ static int qca_setup(struct hci_uart *hu)
 
 	if (!(qca_is_wcn399x(soc_type) ||
 	      qca_is_wcn6750(soc_type) ||
-	      qca_is_wcn6855(soc_type))) {
+	      qca_is_wcn6855(soc_type) ||
+	      qca_is_wcn7850(soc_type))) {
 		/* Get QCA version information */
 		ret = qca_read_soc_version(hdev, &ver, soc_type);
 		if (ret)
@@ -1909,6 +1917,20 @@ static const struct qca_device_data qca_soc_data_wcn6855 __maybe_unused = {
 	.capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES,
 };
 
+static const struct qca_device_data qca_soc_data_wcn7850 __maybe_unused = {
+	.soc_type = QCA_WCN7850,
+	.vregs = (struct qca_vreg []) {
+		{ "vddio", 5000 },
+		{ "vddaon", 26000 },
+		{ "vdddig", 126000 },
+		{ "vddrfa0p8", 102000 },
+		{ "vddrfa1p2", 257000 },
+		{ "vddrfa1p9", 302000 },
+	},
+	.num_vregs = 6,
+	.capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES,
+};
+
 static void qca_power_shutdown(struct hci_uart *hu)
 {
 	struct qca_serdev *qcadev;
@@ -2074,7 +2096,8 @@ static int qca_serdev_probe(struct serdev_device *serdev)
 	if (data &&
 	    (qca_is_wcn399x(data->soc_type) ||
 	     qca_is_wcn6750(data->soc_type) ||
-	     qca_is_wcn6855(data->soc_type))) {
+	     qca_is_wcn6855(data->soc_type) ||
+	     qca_is_wcn7850(data->soc_type))) {
 		qcadev->btsoc_type = data->soc_type;
 		qcadev->bt_power = devm_kzalloc(&serdev->dev,
 						sizeof(struct qca_power),
@@ -2105,7 +2128,8 @@ static int qca_serdev_probe(struct serdev_device *serdev)
 					       GPIOD_IN);
 		if (IS_ERR_OR_NULL(qcadev->sw_ctrl) &&
 		    (data->soc_type == QCA_WCN6750 ||
-		     data->soc_type == QCA_WCN6855))
+		     data->soc_type == QCA_WCN6855 ||
+		     data->soc_type == QCA_WCN7850))
 			dev_warn(&serdev->dev, "failed to acquire SW_CTRL gpio\n");
 
 		qcadev->susclk = devm_clk_get_optional(&serdev->dev, NULL);
@@ -2182,7 +2206,8 @@ static void qca_serdev_remove(struct serdev_device *serdev)
 
 	if ((qca_is_wcn399x(qcadev->btsoc_type) ||
 	     qca_is_wcn6750(qcadev->btsoc_type) ||
-	     qca_is_wcn6855(qcadev->btsoc_type)) &&
+	     qca_is_wcn6855(qcadev->btsoc_type) ||
+	     qca_is_wcn7850(qcadev->btsoc_type)) &&
 	    power->vregs_on)
 		qca_power_shutdown(&qcadev->serdev_hu);
 	else if (qcadev->susclk)
@@ -2368,6 +2393,7 @@ static const struct of_device_id qca_bluetooth_of_match[] = {
 	{ .compatible = "qcom,wcn3998-bt", .data = &qca_soc_data_wcn3998},
 	{ .compatible = "qcom,wcn6750-bt", .data = &qca_soc_data_wcn6750},
 	{ .compatible = "qcom,wcn6855-bt", .data = &qca_soc_data_wcn6855},
+	{ .compatible = "qcom,wcn7850-bt", .data = &qca_soc_data_wcn7850},
 	{ /* sentinel */ }
 };
 MODULE_DEVICE_TABLE(of, qca_bluetooth_of_match);

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 3/4] arm64: dts: qcom: sm8550: add UART14 nodes
  2023-06-20 15:19 [PATCH 0/4] bluetooth: qca: enable WCN7850 support Neil Armstrong
  2023-06-20 15:19 ` [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset Neil Armstrong
  2023-06-20 15:19 ` [PATCH 2/4] bluetooth: qca: add support for WCN7850 Neil Armstrong
@ 2023-06-20 15:19 ` Neil Armstrong
  2023-06-20 15:19 ` [PATCH 4/4] arm64: dts: qcom: sm8550-qrd: add bluetooth support Neil Armstrong
  3 siblings, 0 replies; 10+ messages in thread
From: Neil Armstrong @ 2023-06-20 15:19 UTC (permalink / raw)
  To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Balakrishna Godavarthi, Rocky Liao, Marcel Holtmann,
	Johan Hedberg, Luiz Augusto von Dentz, Andy Gross,
	Bjorn Andersson, Konrad Dybcio
  Cc: netdev, devicetree, linux-kernel, linux-bluetooth, linux-arm-msm,
	Neil Armstrong

Add the Geni High Speed UART QUP instance 2 element 6
node and associated default pinctrl.

Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
---
 arch/arm64/boot/dts/qcom/sm8550.dtsi | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/arch/arm64/boot/dts/qcom/sm8550.dtsi b/arch/arm64/boot/dts/qcom/sm8550.dtsi
index 41d60af93692..25dfc5fc5580 100644
--- a/arch/arm64/boot/dts/qcom/sm8550.dtsi
+++ b/arch/arm64/boot/dts/qcom/sm8550.dtsi
@@ -1053,6 +1053,20 @@ spi13: spi@894000 {
 				status = "disabled";
 			};
 
+			uart14: uart@898000 {
+				compatible = "qcom,geni-uart";
+				reg = <0 0x898000 0 0x4000>;
+				clock-names = "se";
+				clocks = <&gcc GCC_QUPV3_WRAP2_S6_CLK>;
+				pinctrl-names = "default";
+				pinctrl-0 = <&qup_uart14_default>, <&qup_uart14_cts_rts>;
+				interrupts = <GIC_SPI 461 IRQ_TYPE_LEVEL_HIGH>;
+				interconnects = <&clk_virt MASTER_QUP_CORE_2 0 &clk_virt SLAVE_QUP_CORE_2 0>,
+						<&gem_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_QUP_2 0>;
+				interconnect-names = "qup-core", "qup-config";
+				status = "disabled";
+			};
+
 			i2c15: i2c@89c000 {
 				compatible = "qcom,geni-i2c";
 				reg = <0 0x0089c000 0 0x4000>;
@@ -3471,6 +3485,22 @@ qup_uart7_default: qup-uart7-default-state {
 				bias-disable;
 			};
 
+			qup_uart14_default: qup-uart14-default-state {
+				/* TX, RX */
+				pins = "gpio78", "gpio79";
+				function = "qup2_se6";
+				drive-strength = <2>;
+				bias-pull-up;
+			};
+
+			qup_uart14_cts_rts: qup-uart14-cts-rts-state {
+				/* CTS, RTS */
+				pins = "gpio76", "gpio77";
+				function = "qup2_se6";
+				drive-strength = <2>;
+				bias-pull-down;
+			};
+
 			sdc2_sleep: sdc2-sleep-state {
 				clk-pins {
 					pins = "sdc2_clk";

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 4/4] arm64: dts: qcom: sm8550-qrd: add bluetooth support
  2023-06-20 15:19 [PATCH 0/4] bluetooth: qca: enable WCN7850 support Neil Armstrong
                   ` (2 preceding siblings ...)
  2023-06-20 15:19 ` [PATCH 3/4] arm64: dts: qcom: sm8550: add UART14 nodes Neil Armstrong
@ 2023-06-20 15:19 ` Neil Armstrong
  3 siblings, 0 replies; 10+ messages in thread
From: Neil Armstrong @ 2023-06-20 15:19 UTC (permalink / raw)
  To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Balakrishna Godavarthi, Rocky Liao, Marcel Holtmann,
	Johan Hedberg, Luiz Augusto von Dentz, Andy Gross,
	Bjorn Andersson, Konrad Dybcio
  Cc: netdev, devicetree, linux-kernel, linux-bluetooth, linux-arm-msm,
	Neil Armstrong

Enable the WCN7850 bluetooth over the UART14 link.

Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
---
 arch/arm64/boot/dts/qcom/sm8550-qrd.dts | 43 +++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/arch/arm64/boot/dts/qcom/sm8550-qrd.dts b/arch/arm64/boot/dts/qcom/sm8550-qrd.dts
index ec4feee6837d..5191fdbe72cb 100644
--- a/arch/arm64/boot/dts/qcom/sm8550-qrd.dts
+++ b/arch/arm64/boot/dts/qcom/sm8550-qrd.dts
@@ -22,6 +22,7 @@ / {
 
 	aliases {
 		serial0 = &uart7;
+		serial1 = &uart14;
 	};
 
 	wcd938x: audio-codec {
@@ -691,6 +692,10 @@ &qupv3_id_0 {
 	status = "okay";
 };
 
+&qupv3_id_1 {
+	status = "okay";
+};
+
 &remoteproc_adsp {
 	firmware-name = "qcom/sm8550/adsp.mbn",
 			"qcom/sm8550/adsp_dtb.mbn";
@@ -768,6 +773,21 @@ wcd_tx: codec@0,3 {
 &tlmm {
 	gpio-reserved-ranges = <32 8>;
 
+	bt_default: bt-default-state {
+		bt-en-pins {
+			pins = "gpio81";
+			function = "gpio";
+			drive-strength = <16>;
+			bias-disable;
+		};
+
+		sw-ctrl-pins {
+			pins = "gpio82";
+			function = "gpio";
+			bias-pull-down;
+		};
+	};
+
 	sde_dsi_active: sde-dsi-active-state {
 		pins = "gpio133";
 		function = "gpio";
@@ -809,6 +829,29 @@ &uart7 {
 	status = "okay";
 };
 
+&uart14 {
+	status = "okay";
+
+	bluetooth {
+		compatible = "qcom,wcn7850-bt";
+
+		vddio-supply = <&vreg_l15b_1p8>;
+		vddaon-supply = <&vreg_s4e_0p95>;
+		vdddig-supply = <&vreg_s4e_0p95>;
+		vddrfa0p8-supply = <&vreg_s4e_0p95>;
+		vddrfa1p2-supply = <&vreg_s4g_1p25>;
+		vddrfa1p9-supply = <&vreg_s6g_1p86>;
+
+		max-speed = <3200000>;
+
+		enable-gpios = <&tlmm 81 GPIO_ACTIVE_HIGH>;
+		swctrl-gpios = <&tlmm 82 GPIO_ACTIVE_HIGH>;
+
+		pinctrl-0 = <&bt_default>;
+		pinctrl-names = "default";
+	};
+};
+
 &ufs_mem_hc {
 	reset-gpios = <&tlmm 210 GPIO_ACTIVE_LOW>;
 	vcc-supply = <&vreg_l17b_2p5>;

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* RE: bluetooth: qca: enable WCN7850 support
  2023-06-20 15:19 ` [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset Neil Armstrong
@ 2023-06-20 15:37   ` bluez.test.bot
  2023-06-22  1:54   ` [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset Rob Herring
  1 sibling, 0 replies; 10+ messages in thread
From: bluez.test.bot @ 2023-06-20 15:37 UTC (permalink / raw)
  To: linux-bluetooth, neil.armstrong

[-- Attachment #1: Type: text/plain, Size: 579 bytes --]

This is an automated email and please do not reply to this email.

Dear Submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
While preparing the CI tests, the patches you submitted couldn't be applied to the current HEAD of the repository.

----- Output -----

error: patch failed: arch/arm64/boot/dts/qcom/sm8550-qrd.dts:22
error: arch/arm64/boot/dts/qcom/sm8550-qrd.dts: patch does not apply
hint: Use 'git am --show-current-patch' to see the failed patch

Please resolve the issue and submit the patches again.


---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/4] bluetooth: qca: add support for WCN7850
  2023-06-20 15:19 ` [PATCH 2/4] bluetooth: qca: add support for WCN7850 Neil Armstrong
@ 2023-06-20 15:43   ` Konrad Dybcio
  2023-06-22 19:54     ` Luiz Augusto von Dentz
  0 siblings, 1 reply; 10+ messages in thread
From: Konrad Dybcio @ 2023-06-20 15:43 UTC (permalink / raw)
  To: Neil Armstrong, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Balakrishna Godavarthi, Rocky Liao, Marcel Holtmann,
	Johan Hedberg, Luiz Augusto von Dentz, Andy Gross,
	Bjorn Andersson
  Cc: netdev, devicetree, linux-kernel, linux-bluetooth, linux-arm-msm

On 20.06.2023 17:19, Neil Armstrong wrote:
> Add support for the WCN7850 Bluetooth chipset.
> 
> Tested on the SM8550 QRD platform.
> 
> Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
> ---
I don't have comments for this patch specifically, but:


>  drivers/bluetooth/btqca.c   |  7 +++++++
>  drivers/bluetooth/btqca.h   | 10 ++++++++++
>  drivers/bluetooth/hci_qca.c | 48 ++++++++++++++++++++++++++++++++++-----------
>  3 files changed, 54 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c
> index e7e58a956d15..037146b476ff 100644
> --- a/drivers/bluetooth/btqca.c
> +++ b/drivers/bluetooth/btqca.c
> @@ -617,6 +617,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
>  	} else if (soc_type == QCA_WCN6855) {
>  		snprintf(config.fwname, sizeof(config.fwname),
>  			 "qca/hpbtfw%02x.tlv", rom_ver);
> +	} else if (soc_type == QCA_WCN7850) {
> +		snprintf(config.fwname, sizeof(config.fwname),
> +			 "qca/hmtbtfw%02x.tlv", rom_ver);
>  	} else {
>  		snprintf(config.fwname, sizeof(config.fwname),
>  			 "qca/rampatch_%08x.bin", soc_ver);
> @@ -654,6 +657,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
>  	else if (soc_type == QCA_WCN6855)
>  		snprintf(config.fwname, sizeof(config.fwname),
>  			 "qca/hpnv%02x.bin", rom_ver);
> +	else if (soc_type == QCA_WCN7850)
> +		snprintf(config.fwname, sizeof(config.fwname),
> +			 "qca/hmtnv%02x.bin", rom_ver);
>  	else
>  		snprintf(config.fwname, sizeof(config.fwname),
>  			 "qca/nvm_%08x.bin", soc_ver);
The above changes should probably be made switch statements as well

> @@ -695,6 +701,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
>  	case QCA_WCN3991:
>  	case QCA_WCN6750:
>  	case QCA_WCN6855:
> +	case QCA_WCN7850:
>  		/* get fw build info */
>  		err = qca_read_fw_build_info(hdev);
>  		if (err < 0)
> diff --git a/drivers/bluetooth/btqca.h b/drivers/bluetooth/btqca.h
> index b884095bcd9d..ff1850e984fe 100644
> --- a/drivers/bluetooth/btqca.h
> +++ b/drivers/bluetooth/btqca.h
> @@ -148,6 +148,7 @@ enum qca_btsoc_type {
>  	QCA_QCA6390,
>  	QCA_WCN6750,
>  	QCA_WCN6855,
> +	QCA_WCN7850,
>  };
>  
>  #if IS_ENABLED(CONFIG_BT_QCA)
> @@ -173,6 +174,10 @@ static inline bool qca_is_wcn6855(enum qca_btsoc_type soc_type)
>  {
>  	return soc_type == QCA_WCN6855;
>  }
> +static inline bool qca_is_wcn7850(enum qca_btsoc_type soc_type)
> +{
> +	return soc_type == QCA_WCN7850;
> +}
>  
>  #else
>  
> @@ -216,6 +221,11 @@ static inline bool qca_is_wcn6855(enum qca_btsoc_type soc_type)
>  	return false;
>  }
>  
> +static inline bool qca_is_wcn7850(enum qca_btsoc_type soc_type)
> +{
> +	return false;
> +}
> +
>  static inline int qca_send_pre_shutdown_cmd(struct hci_dev *hdev)
>  {
>  	return -EOPNOTSUPP;
> diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
> index e30c979535b1..49b8d75d271e 100644
> --- a/drivers/bluetooth/hci_qca.c
> +++ b/drivers/bluetooth/hci_qca.c
> @@ -1322,7 +1322,8 @@ static int qca_set_baudrate(struct hci_dev *hdev, uint8_t baudrate)
>  	/* Give the controller time to process the request */
>  	if (qca_is_wcn399x(qca_soc_type(hu)) ||
>  	    qca_is_wcn6750(qca_soc_type(hu)) ||
> -	    qca_is_wcn6855(qca_soc_type(hu)))
> +	    qca_is_wcn6855(qca_soc_type(hu)) ||
> +	    qca_is_wcn7850(qca_soc_type(hu)))
>  		usleep_range(1000, 10000);
Separate topic, but I see usages of the helper and raw comparisons
everywhere.. I'd vote for switch everywhere

Konrad
>  	else
>  		msleep(300);
> @@ -1400,7 +1401,8 @@ static int qca_check_speeds(struct hci_uart *hu)
>  {
>  	if (qca_is_wcn399x(qca_soc_type(hu)) ||
>  	    qca_is_wcn6750(qca_soc_type(hu)) ||
> -	    qca_is_wcn6855(qca_soc_type(hu))) {
> +	    qca_is_wcn6855(qca_soc_type(hu)) ||
> +	    qca_is_wcn7850(qca_soc_type(hu))) {
>  		if (!qca_get_speed(hu, QCA_INIT_SPEED) &&
>  		    !qca_get_speed(hu, QCA_OPER_SPEED))
>  			return -EINVAL;
> @@ -1435,7 +1437,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type)
>  		 */
>  		if (qca_is_wcn399x(soc_type) ||
>  		    qca_is_wcn6750(soc_type) ||
> -		    qca_is_wcn6855(soc_type))
> +		    qca_is_wcn6855(soc_type) ||
> +		    qca_is_wcn7850(soc_type))
>  			hci_uart_set_flow_control(hu, true);
>  
>  		if (soc_type == QCA_WCN3990) {
> @@ -1454,7 +1457,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type)
>  error:
>  		if (qca_is_wcn399x(soc_type) ||
>  		    qca_is_wcn6750(soc_type) ||
> -		    qca_is_wcn6855(soc_type))
> +		    qca_is_wcn6855(soc_type) ||
> +		    qca_is_wcn7850(soc_type))
>  			hci_uart_set_flow_control(hu, false);
>  
>  		if (soc_type == QCA_WCN3990) {
> @@ -1691,7 +1695,8 @@ static int qca_power_on(struct hci_dev *hdev)
>  
>  	if (qca_is_wcn399x(soc_type) ||
>  	    qca_is_wcn6750(soc_type) ||
> -	    qca_is_wcn6855(soc_type)) {
> +	    qca_is_wcn6855(soc_type) ||
> +	    qca_is_wcn7850(soc_type)) {
>  		ret = qca_regulator_init(hu);
>  	} else {
>  		qcadev = serdev_device_get_drvdata(hu->serdev);
> @@ -1733,7 +1738,8 @@ static int qca_setup(struct hci_uart *hu)
>  	bt_dev_info(hdev, "setting up %s",
>  		qca_is_wcn399x(soc_type) ? "wcn399x" :
>  		(soc_type == QCA_WCN6750) ? "wcn6750" :
> -		(soc_type == QCA_WCN6855) ? "wcn6855" : "ROME/QCA6390");
> +		(soc_type == QCA_WCN6855) ? "wcn6855" :
> +		(soc_type == QCA_WCN7850) ? "wcn7850" : "ROME/QCA6390");
>  
>  	qca->memdump_state = QCA_MEMDUMP_IDLE;
>  
> @@ -1746,7 +1752,8 @@ static int qca_setup(struct hci_uart *hu)
>  
>  	if (qca_is_wcn399x(soc_type) ||
>  	    qca_is_wcn6750(soc_type) ||
> -	    qca_is_wcn6855(soc_type)) {
> +	    qca_is_wcn6855(soc_type) ||
> +	    qca_is_wcn7850(soc_type)) {
>  		set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks);
>  		hci_set_aosp_capable(hdev);
>  
> @@ -1769,7 +1776,8 @@ static int qca_setup(struct hci_uart *hu)
>  
>  	if (!(qca_is_wcn399x(soc_type) ||
>  	      qca_is_wcn6750(soc_type) ||
> -	      qca_is_wcn6855(soc_type))) {
> +	      qca_is_wcn6855(soc_type) ||
> +	      qca_is_wcn7850(soc_type))) {
>  		/* Get QCA version information */
>  		ret = qca_read_soc_version(hdev, &ver, soc_type);
>  		if (ret)
> @@ -1909,6 +1917,20 @@ static const struct qca_device_data qca_soc_data_wcn6855 __maybe_unused = {
>  	.capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES,
>  };
>  
> +static const struct qca_device_data qca_soc_data_wcn7850 __maybe_unused = {
> +	.soc_type = QCA_WCN7850,
> +	.vregs = (struct qca_vreg []) {
> +		{ "vddio", 5000 },
> +		{ "vddaon", 26000 },
> +		{ "vdddig", 126000 },
> +		{ "vddrfa0p8", 102000 },
> +		{ "vddrfa1p2", 257000 },
> +		{ "vddrfa1p9", 302000 },
> +	},
> +	.num_vregs = 6,
> +	.capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES,
> +};
> +
>  static void qca_power_shutdown(struct hci_uart *hu)
>  {
>  	struct qca_serdev *qcadev;
> @@ -2074,7 +2096,8 @@ static int qca_serdev_probe(struct serdev_device *serdev)
>  	if (data &&
>  	    (qca_is_wcn399x(data->soc_type) ||
>  	     qca_is_wcn6750(data->soc_type) ||
> -	     qca_is_wcn6855(data->soc_type))) {
> +	     qca_is_wcn6855(data->soc_type) ||
> +	     qca_is_wcn7850(data->soc_type))) {
>  		qcadev->btsoc_type = data->soc_type;
>  		qcadev->bt_power = devm_kzalloc(&serdev->dev,
>  						sizeof(struct qca_power),
> @@ -2105,7 +2128,8 @@ static int qca_serdev_probe(struct serdev_device *serdev)
>  					       GPIOD_IN);
>  		if (IS_ERR_OR_NULL(qcadev->sw_ctrl) &&
>  		    (data->soc_type == QCA_WCN6750 ||
> -		     data->soc_type == QCA_WCN6855))
> +		     data->soc_type == QCA_WCN6855 ||
> +		     data->soc_type == QCA_WCN7850))
>  			dev_warn(&serdev->dev, "failed to acquire SW_CTRL gpio\n");
>  
>  		qcadev->susclk = devm_clk_get_optional(&serdev->dev, NULL);
> @@ -2182,7 +2206,8 @@ static void qca_serdev_remove(struct serdev_device *serdev)
>  
>  	if ((qca_is_wcn399x(qcadev->btsoc_type) ||
>  	     qca_is_wcn6750(qcadev->btsoc_type) ||
> -	     qca_is_wcn6855(qcadev->btsoc_type)) &&
> +	     qca_is_wcn6855(qcadev->btsoc_type) ||
> +	     qca_is_wcn7850(qcadev->btsoc_type)) &&
>  	    power->vregs_on)
>  		qca_power_shutdown(&qcadev->serdev_hu);
>  	else if (qcadev->susclk)
> @@ -2368,6 +2393,7 @@ static const struct of_device_id qca_bluetooth_of_match[] = {
>  	{ .compatible = "qcom,wcn3998-bt", .data = &qca_soc_data_wcn3998},
>  	{ .compatible = "qcom,wcn6750-bt", .data = &qca_soc_data_wcn6750},
>  	{ .compatible = "qcom,wcn6855-bt", .data = &qca_soc_data_wcn6855},
> +	{ .compatible = "qcom,wcn7850-bt", .data = &qca_soc_data_wcn7850},
>  	{ /* sentinel */ }
>  };
>  MODULE_DEVICE_TABLE(of, qca_bluetooth_of_match);
> 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset
  2023-06-20 15:19 ` [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset Neil Armstrong
  2023-06-20 15:37   ` bluetooth: qca: enable WCN7850 support bluez.test.bot
@ 2023-06-22  1:54   ` Rob Herring
  1 sibling, 0 replies; 10+ messages in thread
From: Rob Herring @ 2023-06-22  1:54 UTC (permalink / raw)
  To: Neil Armstrong
  Cc: netdev, Balakrishna Godavarthi, David S. Miller, Bjorn Andersson,
	Andy Gross, linux-bluetooth, Conor Dooley, linux-kernel,
	Jakub Kicinski, Johan Hedberg, Luiz Augusto von Dentz,
	devicetree, Rob Herring, Rocky Liao, linux-arm-msm, Eric Dumazet,
	Marcel Holtmann, Krzysztof Kozlowski, Konrad Dybcio, Paolo Abeni


On Tue, 20 Jun 2023 17:19:36 +0200, Neil Armstrong wrote:
> Document the WCN7850 Bluetooth chipset.
> 
> Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
> ---
>  .../bindings/net/bluetooth/qualcomm-bluetooth.yaml | 23 ++++++++++++++++++++++
>  1 file changed, 23 insertions(+)
> 

Reviewed-by: Rob Herring <robh@kernel.org>


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/4] bluetooth: qca: add support for WCN7850
  2023-06-20 15:43   ` Konrad Dybcio
@ 2023-06-22 19:54     ` Luiz Augusto von Dentz
  2023-06-23 12:52       ` Neil Armstrong
  0 siblings, 1 reply; 10+ messages in thread
From: Luiz Augusto von Dentz @ 2023-06-22 19:54 UTC (permalink / raw)
  To: Konrad Dybcio
  Cc: Neil Armstrong, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Balakrishna Godavarthi, Rocky Liao, Marcel Holtmann,
	Johan Hedberg, Andy Gross, Bjorn Andersson, netdev, devicetree,
	linux-kernel, linux-bluetooth, linux-arm-msm

Hi Neil

On Tue, Jun 20, 2023 at 8:43 AM Konrad Dybcio <konrad.dybcio@linaro.org> wrote:
>
> On 20.06.2023 17:19, Neil Armstrong wrote:
> > Add support for the WCN7850 Bluetooth chipset.
> >
> > Tested on the SM8550 QRD platform.
> >
> > Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
> > ---
> I don't have comments for this patch specifically, but:
>
>
> >  drivers/bluetooth/btqca.c   |  7 +++++++
> >  drivers/bluetooth/btqca.h   | 10 ++++++++++
> >  drivers/bluetooth/hci_qca.c | 48 ++++++++++++++++++++++++++++++++++-----------
> >  3 files changed, 54 insertions(+), 11 deletions(-)
> >
> > diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c
> > index e7e58a956d15..037146b476ff 100644
> > --- a/drivers/bluetooth/btqca.c
> > +++ b/drivers/bluetooth/btqca.c
> > @@ -617,6 +617,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
> >       } else if (soc_type == QCA_WCN6855) {
> >               snprintf(config.fwname, sizeof(config.fwname),
> >                        "qca/hpbtfw%02x.tlv", rom_ver);
> > +     } else if (soc_type == QCA_WCN7850) {
> > +             snprintf(config.fwname, sizeof(config.fwname),
> > +                      "qca/hmtbtfw%02x.tlv", rom_ver);
> >       } else {
> >               snprintf(config.fwname, sizeof(config.fwname),
> >                        "qca/rampatch_%08x.bin", soc_ver);
> > @@ -654,6 +657,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
> >       else if (soc_type == QCA_WCN6855)
> >               snprintf(config.fwname, sizeof(config.fwname),
> >                        "qca/hpnv%02x.bin", rom_ver);
> > +     else if (soc_type == QCA_WCN7850)
> > +             snprintf(config.fwname, sizeof(config.fwname),
> > +                      "qca/hmtnv%02x.bin", rom_ver);
> >       else
> >               snprintf(config.fwname, sizeof(config.fwname),
> >                        "qca/nvm_%08x.bin", soc_ver);
> The above changes should probably be made switch statements as well
>
> > @@ -695,6 +701,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
> >       case QCA_WCN3991:
> >       case QCA_WCN6750:
> >       case QCA_WCN6855:
> > +     case QCA_WCN7850:
> >               /* get fw build info */
> >               err = qca_read_fw_build_info(hdev);
> >               if (err < 0)
> > diff --git a/drivers/bluetooth/btqca.h b/drivers/bluetooth/btqca.h
> > index b884095bcd9d..ff1850e984fe 100644
> > --- a/drivers/bluetooth/btqca.h
> > +++ b/drivers/bluetooth/btqca.h
> > @@ -148,6 +148,7 @@ enum qca_btsoc_type {
> >       QCA_QCA6390,
> >       QCA_WCN6750,
> >       QCA_WCN6855,
> > +     QCA_WCN7850,
> >  };
> >
> >  #if IS_ENABLED(CONFIG_BT_QCA)
> > @@ -173,6 +174,10 @@ static inline bool qca_is_wcn6855(enum qca_btsoc_type soc_type)
> >  {
> >       return soc_type == QCA_WCN6855;
> >  }
> > +static inline bool qca_is_wcn7850(enum qca_btsoc_type soc_type)
> > +{
> > +     return soc_type == QCA_WCN7850;
> > +}
> >
> >  #else
> >
> > @@ -216,6 +221,11 @@ static inline bool qca_is_wcn6855(enum qca_btsoc_type soc_type)
> >       return false;
> >  }
> >
> > +static inline bool qca_is_wcn7850(enum qca_btsoc_type soc_type)
> > +{
> > +     return false;
> > +}
> > +
> >  static inline int qca_send_pre_shutdown_cmd(struct hci_dev *hdev)
> >  {
> >       return -EOPNOTSUPP;
> > diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
> > index e30c979535b1..49b8d75d271e 100644
> > --- a/drivers/bluetooth/hci_qca.c
> > +++ b/drivers/bluetooth/hci_qca.c
> > @@ -1322,7 +1322,8 @@ static int qca_set_baudrate(struct hci_dev *hdev, uint8_t baudrate)
> >       /* Give the controller time to process the request */
> >       if (qca_is_wcn399x(qca_soc_type(hu)) ||
> >           qca_is_wcn6750(qca_soc_type(hu)) ||
> > -         qca_is_wcn6855(qca_soc_type(hu)))
> > +         qca_is_wcn6855(qca_soc_type(hu)) ||
> > +         qca_is_wcn7850(qca_soc_type(hu)))
> >               usleep_range(1000, 10000);
> Separate topic, but I see usages of the helper and raw comparisons
> everywhere.. I'd vote for switch everywhere

+1, most of the time it is preferable to go with switches which makes
the code cleaner/more readable, Im fine not requiring it in this set
but I hope someone looks into doing some cleanup in this code.

> Konrad
> >       else
> >               msleep(300);
> > @@ -1400,7 +1401,8 @@ static int qca_check_speeds(struct hci_uart *hu)
> >  {
> >       if (qca_is_wcn399x(qca_soc_type(hu)) ||
> >           qca_is_wcn6750(qca_soc_type(hu)) ||
> > -         qca_is_wcn6855(qca_soc_type(hu))) {
> > +         qca_is_wcn6855(qca_soc_type(hu)) ||
> > +         qca_is_wcn7850(qca_soc_type(hu))) {
> >               if (!qca_get_speed(hu, QCA_INIT_SPEED) &&
> >                   !qca_get_speed(hu, QCA_OPER_SPEED))
> >                       return -EINVAL;
> > @@ -1435,7 +1437,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type)
> >                */
> >               if (qca_is_wcn399x(soc_type) ||
> >                   qca_is_wcn6750(soc_type) ||
> > -                 qca_is_wcn6855(soc_type))
> > +                 qca_is_wcn6855(soc_type) ||
> > +                 qca_is_wcn7850(soc_type))
> >                       hci_uart_set_flow_control(hu, true);
> >
> >               if (soc_type == QCA_WCN3990) {
> > @@ -1454,7 +1457,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type)
> >  error:
> >               if (qca_is_wcn399x(soc_type) ||
> >                   qca_is_wcn6750(soc_type) ||
> > -                 qca_is_wcn6855(soc_type))
> > +                 qca_is_wcn6855(soc_type) ||
> > +                 qca_is_wcn7850(soc_type))
> >                       hci_uart_set_flow_control(hu, false);
> >
> >               if (soc_type == QCA_WCN3990) {
> > @@ -1691,7 +1695,8 @@ static int qca_power_on(struct hci_dev *hdev)
> >
> >       if (qca_is_wcn399x(soc_type) ||
> >           qca_is_wcn6750(soc_type) ||
> > -         qca_is_wcn6855(soc_type)) {
> > +         qca_is_wcn6855(soc_type) ||
> > +         qca_is_wcn7850(soc_type)) {
> >               ret = qca_regulator_init(hu);
> >       } else {
> >               qcadev = serdev_device_get_drvdata(hu->serdev);
> > @@ -1733,7 +1738,8 @@ static int qca_setup(struct hci_uart *hu)
> >       bt_dev_info(hdev, "setting up %s",
> >               qca_is_wcn399x(soc_type) ? "wcn399x" :
> >               (soc_type == QCA_WCN6750) ? "wcn6750" :
> > -             (soc_type == QCA_WCN6855) ? "wcn6855" : "ROME/QCA6390");
> > +             (soc_type == QCA_WCN6855) ? "wcn6855" :
> > +             (soc_type == QCA_WCN7850) ? "wcn7850" : "ROME/QCA6390");
> >
> >       qca->memdump_state = QCA_MEMDUMP_IDLE;
> >
> > @@ -1746,7 +1752,8 @@ static int qca_setup(struct hci_uart *hu)
> >
> >       if (qca_is_wcn399x(soc_type) ||
> >           qca_is_wcn6750(soc_type) ||
> > -         qca_is_wcn6855(soc_type)) {
> > +         qca_is_wcn6855(soc_type) ||
> > +         qca_is_wcn7850(soc_type)) {
> >               set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks);
> >               hci_set_aosp_capable(hdev);
> >
> > @@ -1769,7 +1776,8 @@ static int qca_setup(struct hci_uart *hu)
> >
> >       if (!(qca_is_wcn399x(soc_type) ||
> >             qca_is_wcn6750(soc_type) ||
> > -           qca_is_wcn6855(soc_type))) {
> > +           qca_is_wcn6855(soc_type) ||
> > +           qca_is_wcn7850(soc_type))) {
> >               /* Get QCA version information */
> >               ret = qca_read_soc_version(hdev, &ver, soc_type);
> >               if (ret)
> > @@ -1909,6 +1917,20 @@ static const struct qca_device_data qca_soc_data_wcn6855 __maybe_unused = {
> >       .capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES,
> >  };
> >
> > +static const struct qca_device_data qca_soc_data_wcn7850 __maybe_unused = {
> > +     .soc_type = QCA_WCN7850,
> > +     .vregs = (struct qca_vreg []) {
> > +             { "vddio", 5000 },
> > +             { "vddaon", 26000 },
> > +             { "vdddig", 126000 },
> > +             { "vddrfa0p8", 102000 },
> > +             { "vddrfa1p2", 257000 },
> > +             { "vddrfa1p9", 302000 },
> > +     },
> > +     .num_vregs = 6,
> > +     .capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES,
> > +};
> > +
> >  static void qca_power_shutdown(struct hci_uart *hu)
> >  {
> >       struct qca_serdev *qcadev;
> > @@ -2074,7 +2096,8 @@ static int qca_serdev_probe(struct serdev_device *serdev)
> >       if (data &&
> >           (qca_is_wcn399x(data->soc_type) ||
> >            qca_is_wcn6750(data->soc_type) ||
> > -          qca_is_wcn6855(data->soc_type))) {
> > +          qca_is_wcn6855(data->soc_type) ||
> > +          qca_is_wcn7850(data->soc_type))) {
> >               qcadev->btsoc_type = data->soc_type;
> >               qcadev->bt_power = devm_kzalloc(&serdev->dev,
> >                                               sizeof(struct qca_power),
> > @@ -2105,7 +2128,8 @@ static int qca_serdev_probe(struct serdev_device *serdev)
> >                                              GPIOD_IN);
> >               if (IS_ERR_OR_NULL(qcadev->sw_ctrl) &&
> >                   (data->soc_type == QCA_WCN6750 ||
> > -                  data->soc_type == QCA_WCN6855))
> > +                  data->soc_type == QCA_WCN6855 ||
> > +                  data->soc_type == QCA_WCN7850))
> >                       dev_warn(&serdev->dev, "failed to acquire SW_CTRL gpio\n");
> >
> >               qcadev->susclk = devm_clk_get_optional(&serdev->dev, NULL);
> > @@ -2182,7 +2206,8 @@ static void qca_serdev_remove(struct serdev_device *serdev)
> >
> >       if ((qca_is_wcn399x(qcadev->btsoc_type) ||
> >            qca_is_wcn6750(qcadev->btsoc_type) ||
> > -          qca_is_wcn6855(qcadev->btsoc_type)) &&
> > +          qca_is_wcn6855(qcadev->btsoc_type) ||
> > +          qca_is_wcn7850(qcadev->btsoc_type)) &&
> >           power->vregs_on)
> >               qca_power_shutdown(&qcadev->serdev_hu);
> >       else if (qcadev->susclk)
> > @@ -2368,6 +2393,7 @@ static const struct of_device_id qca_bluetooth_of_match[] = {
> >       { .compatible = "qcom,wcn3998-bt", .data = &qca_soc_data_wcn3998},
> >       { .compatible = "qcom,wcn6750-bt", .data = &qca_soc_data_wcn6750},
> >       { .compatible = "qcom,wcn6855-bt", .data = &qca_soc_data_wcn6855},
> > +     { .compatible = "qcom,wcn7850-bt", .data = &qca_soc_data_wcn7850},
> >       { /* sentinel */ }
> >  };
> >  MODULE_DEVICE_TABLE(of, qca_bluetooth_of_match);
> >



-- 
Luiz Augusto von Dentz

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/4] bluetooth: qca: add support for WCN7850
  2023-06-22 19:54     ` Luiz Augusto von Dentz
@ 2023-06-23 12:52       ` Neil Armstrong
  0 siblings, 0 replies; 10+ messages in thread
From: Neil Armstrong @ 2023-06-23 12:52 UTC (permalink / raw)
  To: Luiz Augusto von Dentz, Konrad Dybcio
  Cc: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Balakrishna Godavarthi, Rocky Liao, Marcel Holtmann,
	Johan Hedberg, Andy Gross, Bjorn Andersson, netdev, devicetree,
	linux-kernel, linux-bluetooth, linux-arm-msm

Hi Luiz,

On 22/06/2023 21:54, Luiz Augusto von Dentz wrote:
> Hi Neil
> 
> On Tue, Jun 20, 2023 at 8:43 AM Konrad Dybcio <konrad.dybcio@linaro.org> wrote:
>>
>> On 20.06.2023 17:19, Neil Armstrong wrote:
>>> Add support for the WCN7850 Bluetooth chipset.
>>>
>>> Tested on the SM8550 QRD platform.
>>>
>>> Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
>>> ---
>> I don't have comments for this patch specifically, but:
>>
>>
>>>   drivers/bluetooth/btqca.c   |  7 +++++++
>>>   drivers/bluetooth/btqca.h   | 10 ++++++++++
>>>   drivers/bluetooth/hci_qca.c | 48 ++++++++++++++++++++++++++++++++++-----------
>>>   3 files changed, 54 insertions(+), 11 deletions(-)
>>>
>>> diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c
>>> index e7e58a956d15..037146b476ff 100644
>>> --- a/drivers/bluetooth/btqca.c
>>> +++ b/drivers/bluetooth/btqca.c
>>> @@ -617,6 +617,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
>>>        } else if (soc_type == QCA_WCN6855) {
>>>                snprintf(config.fwname, sizeof(config.fwname),
>>>                         "qca/hpbtfw%02x.tlv", rom_ver);
>>> +     } else if (soc_type == QCA_WCN7850) {
>>> +             snprintf(config.fwname, sizeof(config.fwname),
>>> +                      "qca/hmtbtfw%02x.tlv", rom_ver);
>>>        } else {
>>>                snprintf(config.fwname, sizeof(config.fwname),
>>>                         "qca/rampatch_%08x.bin", soc_ver);
>>> @@ -654,6 +657,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
>>>        else if (soc_type == QCA_WCN6855)
>>>                snprintf(config.fwname, sizeof(config.fwname),
>>>                         "qca/hpnv%02x.bin", rom_ver);
>>> +     else if (soc_type == QCA_WCN7850)
>>> +             snprintf(config.fwname, sizeof(config.fwname),
>>> +                      "qca/hmtnv%02x.bin", rom_ver);
>>>        else
>>>                snprintf(config.fwname, sizeof(config.fwname),
>>>                         "qca/nvm_%08x.bin", soc_ver);
>> The above changes should probably be made switch statements as well
>>
>>> @@ -695,6 +701,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
>>>        case QCA_WCN3991:
>>>        case QCA_WCN6750:
>>>        case QCA_WCN6855:
>>> +     case QCA_WCN7850:
>>>                /* get fw build info */
>>>                err = qca_read_fw_build_info(hdev);
>>>                if (err < 0)
>>> diff --git a/drivers/bluetooth/btqca.h b/drivers/bluetooth/btqca.h
>>> index b884095bcd9d..ff1850e984fe 100644
>>> --- a/drivers/bluetooth/btqca.h
>>> +++ b/drivers/bluetooth/btqca.h
>>> @@ -148,6 +148,7 @@ enum qca_btsoc_type {
>>>        QCA_QCA6390,
>>>        QCA_WCN6750,
>>>        QCA_WCN6855,
>>> +     QCA_WCN7850,
>>>   };
>>>
>>>   #if IS_ENABLED(CONFIG_BT_QCA)
>>> @@ -173,6 +174,10 @@ static inline bool qca_is_wcn6855(enum qca_btsoc_type soc_type)
>>>   {
>>>        return soc_type == QCA_WCN6855;
>>>   }
>>> +static inline bool qca_is_wcn7850(enum qca_btsoc_type soc_type)
>>> +{
>>> +     return soc_type == QCA_WCN7850;
>>> +}
>>>
>>>   #else
>>>
>>> @@ -216,6 +221,11 @@ static inline bool qca_is_wcn6855(enum qca_btsoc_type soc_type)
>>>        return false;
>>>   }
>>>
>>> +static inline bool qca_is_wcn7850(enum qca_btsoc_type soc_type)
>>> +{
>>> +     return false;
>>> +}
>>> +
>>>   static inline int qca_send_pre_shutdown_cmd(struct hci_dev *hdev)
>>>   {
>>>        return -EOPNOTSUPP;
>>> diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
>>> index e30c979535b1..49b8d75d271e 100644
>>> --- a/drivers/bluetooth/hci_qca.c
>>> +++ b/drivers/bluetooth/hci_qca.c
>>> @@ -1322,7 +1322,8 @@ static int qca_set_baudrate(struct hci_dev *hdev, uint8_t baudrate)
>>>        /* Give the controller time to process the request */
>>>        if (qca_is_wcn399x(qca_soc_type(hu)) ||
>>>            qca_is_wcn6750(qca_soc_type(hu)) ||
>>> -         qca_is_wcn6855(qca_soc_type(hu)))
>>> +         qca_is_wcn6855(qca_soc_type(hu)) ||
>>> +         qca_is_wcn7850(qca_soc_type(hu)))
>>>                usleep_range(1000, 10000);
>> Separate topic, but I see usages of the helper and raw comparisons
>> everywhere.. I'd vote for switch everywhere
> 
> +1, most of the time it is preferable to go with switches which makes
> the code cleaner/more readable, Im fine not requiring it in this set
> but I hope someone looks into doing some cleanup in this code.

Since we have time until the end of the v6.5 merge window I'll add an intermediate
change adding switch/case for v2.

Thanks,
Neil

> 
>> Konrad
>>>        else
>>>                msleep(300);
>>> @@ -1400,7 +1401,8 @@ static int qca_check_speeds(struct hci_uart *hu)
>>>   {
>>>        if (qca_is_wcn399x(qca_soc_type(hu)) ||
>>>            qca_is_wcn6750(qca_soc_type(hu)) ||
>>> -         qca_is_wcn6855(qca_soc_type(hu))) {
>>> +         qca_is_wcn6855(qca_soc_type(hu)) ||
>>> +         qca_is_wcn7850(qca_soc_type(hu))) {
>>>                if (!qca_get_speed(hu, QCA_INIT_SPEED) &&
>>>                    !qca_get_speed(hu, QCA_OPER_SPEED))
>>>                        return -EINVAL;
>>> @@ -1435,7 +1437,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type)
>>>                 */
>>>                if (qca_is_wcn399x(soc_type) ||
>>>                    qca_is_wcn6750(soc_type) ||
>>> -                 qca_is_wcn6855(soc_type))
>>> +                 qca_is_wcn6855(soc_type) ||
>>> +                 qca_is_wcn7850(soc_type))
>>>                        hci_uart_set_flow_control(hu, true);
>>>
>>>                if (soc_type == QCA_WCN3990) {
>>> @@ -1454,7 +1457,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type)
>>>   error:
>>>                if (qca_is_wcn399x(soc_type) ||
>>>                    qca_is_wcn6750(soc_type) ||
>>> -                 qca_is_wcn6855(soc_type))
>>> +                 qca_is_wcn6855(soc_type) ||
>>> +                 qca_is_wcn7850(soc_type))
>>>                        hci_uart_set_flow_control(hu, false);
>>>
>>>                if (soc_type == QCA_WCN3990) {
>>> @@ -1691,7 +1695,8 @@ static int qca_power_on(struct hci_dev *hdev)
>>>
>>>        if (qca_is_wcn399x(soc_type) ||
>>>            qca_is_wcn6750(soc_type) ||
>>> -         qca_is_wcn6855(soc_type)) {
>>> +         qca_is_wcn6855(soc_type) ||
>>> +         qca_is_wcn7850(soc_type)) {
>>>                ret = qca_regulator_init(hu);
>>>        } else {
>>>                qcadev = serdev_device_get_drvdata(hu->serdev);
>>> @@ -1733,7 +1738,8 @@ static int qca_setup(struct hci_uart *hu)
>>>        bt_dev_info(hdev, "setting up %s",
>>>                qca_is_wcn399x(soc_type) ? "wcn399x" :
>>>                (soc_type == QCA_WCN6750) ? "wcn6750" :
>>> -             (soc_type == QCA_WCN6855) ? "wcn6855" : "ROME/QCA6390");
>>> +             (soc_type == QCA_WCN6855) ? "wcn6855" :
>>> +             (soc_type == QCA_WCN7850) ? "wcn7850" : "ROME/QCA6390");
>>>
>>>        qca->memdump_state = QCA_MEMDUMP_IDLE;
>>>
>>> @@ -1746,7 +1752,8 @@ static int qca_setup(struct hci_uart *hu)
>>>
>>>        if (qca_is_wcn399x(soc_type) ||
>>>            qca_is_wcn6750(soc_type) ||
>>> -         qca_is_wcn6855(soc_type)) {
>>> +         qca_is_wcn6855(soc_type) ||
>>> +         qca_is_wcn7850(soc_type)) {
>>>                set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks);
>>>                hci_set_aosp_capable(hdev);
>>>
>>> @@ -1769,7 +1776,8 @@ static int qca_setup(struct hci_uart *hu)
>>>
>>>        if (!(qca_is_wcn399x(soc_type) ||
>>>              qca_is_wcn6750(soc_type) ||
>>> -           qca_is_wcn6855(soc_type))) {
>>> +           qca_is_wcn6855(soc_type) ||
>>> +           qca_is_wcn7850(soc_type))) {
>>>                /* Get QCA version information */
>>>                ret = qca_read_soc_version(hdev, &ver, soc_type);
>>>                if (ret)
>>> @@ -1909,6 +1917,20 @@ static const struct qca_device_data qca_soc_data_wcn6855 __maybe_unused = {
>>>        .capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES,
>>>   };
>>>
>>> +static const struct qca_device_data qca_soc_data_wcn7850 __maybe_unused = {
>>> +     .soc_type = QCA_WCN7850,
>>> +     .vregs = (struct qca_vreg []) {
>>> +             { "vddio", 5000 },
>>> +             { "vddaon", 26000 },
>>> +             { "vdddig", 126000 },
>>> +             { "vddrfa0p8", 102000 },
>>> +             { "vddrfa1p2", 257000 },
>>> +             { "vddrfa1p9", 302000 },
>>> +     },
>>> +     .num_vregs = 6,
>>> +     .capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES,
>>> +};
>>> +
>>>   static void qca_power_shutdown(struct hci_uart *hu)
>>>   {
>>>        struct qca_serdev *qcadev;
>>> @@ -2074,7 +2096,8 @@ static int qca_serdev_probe(struct serdev_device *serdev)
>>>        if (data &&
>>>            (qca_is_wcn399x(data->soc_type) ||
>>>             qca_is_wcn6750(data->soc_type) ||
>>> -          qca_is_wcn6855(data->soc_type))) {
>>> +          qca_is_wcn6855(data->soc_type) ||
>>> +          qca_is_wcn7850(data->soc_type))) {
>>>                qcadev->btsoc_type = data->soc_type;
>>>                qcadev->bt_power = devm_kzalloc(&serdev->dev,
>>>                                                sizeof(struct qca_power),
>>> @@ -2105,7 +2128,8 @@ static int qca_serdev_probe(struct serdev_device *serdev)
>>>                                               GPIOD_IN);
>>>                if (IS_ERR_OR_NULL(qcadev->sw_ctrl) &&
>>>                    (data->soc_type == QCA_WCN6750 ||
>>> -                  data->soc_type == QCA_WCN6855))
>>> +                  data->soc_type == QCA_WCN6855 ||
>>> +                  data->soc_type == QCA_WCN7850))
>>>                        dev_warn(&serdev->dev, "failed to acquire SW_CTRL gpio\n");
>>>
>>>                qcadev->susclk = devm_clk_get_optional(&serdev->dev, NULL);
>>> @@ -2182,7 +2206,8 @@ static void qca_serdev_remove(struct serdev_device *serdev)
>>>
>>>        if ((qca_is_wcn399x(qcadev->btsoc_type) ||
>>>             qca_is_wcn6750(qcadev->btsoc_type) ||
>>> -          qca_is_wcn6855(qcadev->btsoc_type)) &&
>>> +          qca_is_wcn6855(qcadev->btsoc_type) ||
>>> +          qca_is_wcn7850(qcadev->btsoc_type)) &&
>>>            power->vregs_on)
>>>                qca_power_shutdown(&qcadev->serdev_hu);
>>>        else if (qcadev->susclk)
>>> @@ -2368,6 +2393,7 @@ static const struct of_device_id qca_bluetooth_of_match[] = {
>>>        { .compatible = "qcom,wcn3998-bt", .data = &qca_soc_data_wcn3998},
>>>        { .compatible = "qcom,wcn6750-bt", .data = &qca_soc_data_wcn6750},
>>>        { .compatible = "qcom,wcn6855-bt", .data = &qca_soc_data_wcn6855},
>>> +     { .compatible = "qcom,wcn7850-bt", .data = &qca_soc_data_wcn7850},
>>>        { /* sentinel */ }
>>>   };
>>>   MODULE_DEVICE_TABLE(of, qca_bluetooth_of_match);
>>>
> 
> 
> 


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2023-06-23 12:53 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-20 15:19 [PATCH 0/4] bluetooth: qca: enable WCN7850 support Neil Armstrong
2023-06-20 15:19 ` [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset Neil Armstrong
2023-06-20 15:37   ` bluetooth: qca: enable WCN7850 support bluez.test.bot
2023-06-22  1:54   ` [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset Rob Herring
2023-06-20 15:19 ` [PATCH 2/4] bluetooth: qca: add support for WCN7850 Neil Armstrong
2023-06-20 15:43   ` Konrad Dybcio
2023-06-22 19:54     ` Luiz Augusto von Dentz
2023-06-23 12:52       ` Neil Armstrong
2023-06-20 15:19 ` [PATCH 3/4] arm64: dts: qcom: sm8550: add UART14 nodes Neil Armstrong
2023-06-20 15:19 ` [PATCH 4/4] arm64: dts: qcom: sm8550-qrd: add bluetooth support Neil Armstrong

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).