2023-06-20 15:29:15

by Neil Armstrong

[permalink] [raw]
Subject: [PATCH 0/4] bluetooth: qca: enable WCN7850 support

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 <[email protected]>
---
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 <[email protected]>



2023-06-20 15:29:53

by Neil Armstrong

[permalink] [raw]
Subject: [PATCH 4/4] arm64: dts: qcom: sm8550-qrd: add bluetooth support

Enable the WCN7850 bluetooth over the UART14 link.

Signed-off-by: Neil Armstrong <[email protected]>
---
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


2023-06-20 15:31:06

by Neil Armstrong

[permalink] [raw]
Subject: [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset

Document the WCN7850 Bluetooth chipset.

Signed-off-by: Neil Armstrong <[email protected]>
---
.../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


2023-06-20 15:33:03

by Neil Armstrong

[permalink] [raw]
Subject: [PATCH 3/4] arm64: dts: qcom: sm8550: add UART14 nodes

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

Signed-off-by: Neil Armstrong <[email protected]>
---
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


2023-06-20 15:38:27

by Neil Armstrong

[permalink] [raw]
Subject: [PATCH 2/4] bluetooth: qca: add support for WCN7850

Add support for the WCN7850 Bluetooth chipset.

Tested on the SM8550 QRD platform.

Signed-off-by: Neil Armstrong <[email protected]>
---
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


2023-06-20 15:45:01

by bluez.test.bot

[permalink] [raw]
Subject: RE: bluetooth: qca: enable WCN7850 support

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

2023-06-20 15:47:03

by Konrad Dybcio

[permalink] [raw]
Subject: Re: [PATCH 2/4] bluetooth: qca: add support for WCN7850

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 <[email protected]>
> ---
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);
>

2023-06-22 02:04:53

by Rob Herring (Arm)

[permalink] [raw]
Subject: Re: [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset


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

Reviewed-by: Rob Herring <[email protected]>


2023-06-22 20:08:30

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: Re: [PATCH 2/4] bluetooth: qca: add support for WCN7850

Hi Neil

On Tue, Jun 20, 2023 at 8:43 AM Konrad Dybcio <[email protected]> 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 <[email protected]>
> > ---
> 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

2023-06-23 12:55:01

by Neil Armstrong

[permalink] [raw]
Subject: Re: [PATCH 2/4] bluetooth: qca: add support for WCN7850

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 <[email protected]> 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 <[email protected]>
>>> ---
>> 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);
>>>
>
>
>