2023-01-29 21:51:45

by Steev Klimaszewski

[permalink] [raw]
Subject: [PATCH 0/4] Attempt at adding WCN6855 BT support

This patchset is somewhat of an RFC/RFT, and also just something to get this out
there.

First things first, I do not have access to the specs nor the schematics, so a
lot of this was done via guess work, looking at the acpi tables, and looking at
how a similar device (wcn6750) was added.

There are definitely checkpatch warnings, and I do apologize to those who won't
review things until there are no warnings for wasting your time.

One example is that I have the vregs commented out, the dt-bindings say that
they are required since it's based on the wcn6750 work but also like the 6750,
I've added defaults into the driver, and those seem to work, at least for the
initial testing.

The end result is that we do have a working device, but not entirely reliable.

Hopefully by getting this out there, people who do have access to the specs or
schematics can see where the improvements or fixes need to come.

There are a few things that I am not sure why they happen, and don't have the
knowledge level to figure out why they happen or debugging it.

Bluetooth: hci0: setting up wcn6855
Bluetooth: hci0: Frame reassembly failed (-84)
Bluetooth: hci0: QCA Product ID :0x00000013
Bluetooth: hci0: QCA SOC Version :0x400c0210
Bluetooth: hci0: QCA ROM Version :0x00000201
Bluetooth: hci0: QCA Patch Version:0x000038e6
Bluetooth: hci0: QCA controller version 0x02100201
Bluetooth: hci0: unexpected event for opcode 0xfc48
Bluetooth: hci0: Sending QCA Patch config failed (-110)
Bluetooth: hci0: QCA Downloading qca/hpbtfw21.tlv
Bluetooth: hci0: QCA Downloading qca/hpnv21g.bin
Bluetooth: hci0: QCA setup on UART is completed

I do not know why the Frame assembly failed, nor the unexpected event.

Likewise, I'm not entirely sure why it says the patch config send times out, and
*then* seems to send it?

The BD Address also seems to be incorrect, and I'm not sure what is going on
there either.

Additionally, I've tried with an additional patch that I'm not including that is
based on commit 059924fdf6c1 ("Bluetooth: btqca: Use NVM files based on SoC ID
for WCN3991") to try using the hpnv21g.bin or hpnv21.bin, and the firmware acted
the same regardless, so I am assuming I don't truly need the "g" firmware on my
Thinkpad X13s.

Testing was done by connecting a Razer Orochi bluetooth mouse, and using it, as
well as connecting to and using an H2GO bluetooth speaker and playing audio out
via canberra-gtk-play as well as a couple of YouTube videos in a browser.

The mouse only seems to work when < 2 ft. from the laptop, and for the speaker, only
"A2DP Sink, codec SBC" would provide audio output, and while I could see that
data was being sent to the speaker, it wasn't always outputting, and going >
4ft. away, would often disconnect.

steev@wintermute:~$ hciconfig -a
hci0: Type: Primary Bus: UART
BD Address: 00:00:00:00:5A:AD ACL MTU: 1024:8 SCO MTU: 240:4
UP RUNNING PSCAN
RX bytes:1492 acl:0 sco:0 events:126 errors:0
TX bytes:128743 acl:0 sco:0 commands:597 errors:0
Features: 0xff 0xfe 0x8f 0xfe 0xd8 0x3f 0x5b 0x87
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
Link policy: RSWITCH HOLD SNIFF
Link mode: PERIPHERAL ACCEPT
Name: 'wintermute'
Class: 0x0c010c
Service Classes: Rendering, Capturing
Device Class: Computer, Laptop
HCI Version: (0xc) Revision: 0x0
LMP Version: (0xc) Subversion: 0x46f7
Manufacturer: Qualcomm (29)

steev@wintermute:~$ dmesg | grep Razer
[ 3089.235440] input: Razer Orochi as /devices/virtual/misc/uhid/0005:1532:0056.0003/input/input11
[ 3089.238580] hid-generic 0005:1532:0056.0003: input,hidraw2: BLUETOOTH HID v0.01 Mouse [Razer Orochi] on 00:00:00:00:5a:ad
steev@wintermute:~$ dmesg | grep H2GO
[ 3140.959947] input: H2GO Speaker (AVRCP) as /devices/virtual/input/input12

Bjorn Andersson (1):
arm64: dts: qcom: sc8280xp: Enable BT

Steev Klimaszewski (3):
dt-bindings: net: Add WCN6855 Bluetooth bindings
Bluetooth: hci_qca: Add support for QTI Bluetooth chip wcn6855
arm64: dts: qcom: thinkpad-x13s: Add bluetooth

.../net/bluetooth/qualcomm-bluetooth.yaml | 2 +
.../qcom/sc8280xp-lenovo-thinkpad-x13s.dts | 68 +++++++++++++++++++
arch/arm64/boot/dts/qcom/sc8280xp.dtsi | 14 ++++
drivers/bluetooth/btqca.c | 24 ++++++-
drivers/bluetooth/btqca.h | 10 +++
drivers/bluetooth/hci_qca.c | 59 ++++++++++++----
6 files changed, 162 insertions(+), 15 deletions(-)


base-commit: e2f86c02fdc96ca29ced53221a3cbf50aa6f8b49
--
2.39.0



2023-01-29 21:51:58

by Steev Klimaszewski

[permalink] [raw]
Subject: [PATCH 1/4] dt-bindings: net: Add WCN6855 Bluetooth bindings

Add bindings for the QTI WCN6855 chipset, based on the WCN6750.

Signed-off-by: Steev Klimaszewski <[email protected]>
---
.../devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml | 2 ++
1 file changed, 2 insertions(+)

diff --git a/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml b/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml
index a6a6b0e4df7a..64e278561ba8 100644
--- a/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml
+++ b/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml
@@ -23,6 +23,7 @@ properties:
- qcom,wcn3998-bt
- qcom,qca6390-bt
- qcom,wcn6750-bt
+ - qcom,wcn6855-bt

enable-gpios:
maxItems: 1
@@ -121,6 +122,7 @@ allOf:
contains:
enum:
- qcom,wcn6750-bt
+ - qcom,wcn6855-bt
then:
required:
- enable-gpios
--
2.39.0


2023-01-29 21:52:07

by Steev Klimaszewski

[permalink] [raw]
Subject: [PATCH 2/4] Bluetooth: hci_qca: Add support for QTI Bluetooth chip wcn6855

Added regulators,GPIOs and changes required to power on/off wcn6855.
Added support for firmware download for wcn6855.

This is based on commit d8f97da1b92d ("Bluetooth: hci_qca: Add support for QTI Bluetooth chip wcn6750")

Signed-off-by: Steev Klimaszewski <[email protected]>
---
drivers/bluetooth/btqca.c | 24 +++++++++++++--
drivers/bluetooth/btqca.h | 10 +++++++
drivers/bluetooth/hci_qca.c | 59 +++++++++++++++++++++++++++++--------
3 files changed, 78 insertions(+), 15 deletions(-)

diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c
index c9064d34d830..456b961b9554 100644
--- a/drivers/bluetooth/btqca.c
+++ b/drivers/bluetooth/btqca.c
@@ -472,6 +472,19 @@ static int qca_download_firmware(struct hci_dev *hdev,
config->fwname, ret);
return ret;
}
+ } else if (soc_type == QCA_WCN6855 && config->type == ELF_TYPE_PATCH) {
+ bt_dev_dbg(hdev, "QCA Failed to request file: %s (%d)",
+ config->fwname, ret);
+ config->type = TLV_TYPE_PATCH;
+ snprintf(config->fwname, sizeof(config->fwname),
+ "qca/hpbtfw%02x.tlv", rom_ver);
+ bt_dev_info(hdev, "QCA Downloading %s", config->fwname);
+ ret = request_firmware(&fw, config->fwname, &hdev->dev);
+ if (ret) {
+ bt_dev_err(hdev, "QCA Failed to request file: %s (%d)",
+ config->fwname, ret);
+ return ret;
+ }
} else {
bt_dev_err(hdev, "QCA Failed to request file: %s (%d)",
config->fwname, ret);
@@ -596,7 +609,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
*/
rom_ver = ((soc_ver & 0x00000f00) >> 0x04) | (soc_ver & 0x0000000f);

- if (soc_type == QCA_WCN6750)
+ if (soc_type == QCA_WCN6750 || soc_type == QCA_WCN6855)
qca_send_patch_config_cmd(hdev);

/* Download rampatch file */
@@ -614,6 +627,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
config.type = ELF_TYPE_PATCH;
snprintf(config.fwname, sizeof(config.fwname),
"qca/msbtfw%02x.mbn", rom_ver);
+ } else if (soc_type == QCA_WCN6855) {
+ snprintf(config.fwname, sizeof(config.fwname),
+ "qca/hpbtfw%02x.tlv", rom_ver);
} else {
snprintf(config.fwname, sizeof(config.fwname),
"qca/rampatch_%08x.bin", soc_ver);
@@ -648,6 +664,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
else if (soc_type == QCA_WCN6750)
snprintf(config.fwname, sizeof(config.fwname),
"qca/msnv%02x.bin", rom_ver);
+ else if (soc_type == QCA_WCN6855)
+ snprintf(config.fwname, sizeof(config.fwname),
+ "qca/hpnv%02x.bin", rom_ver);
else
snprintf(config.fwname, sizeof(config.fwname),
"qca/nvm_%08x.bin", soc_ver);
@@ -672,6 +691,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
case QCA_WCN3991:
case QCA_WCN3998:
case QCA_WCN6750:
+ case QCA_WCN6855:
hci_set_msft_opcode(hdev, 0xFD70);
break;
default:
@@ -685,7 +705,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
return err;
}

- if (soc_type == QCA_WCN3991 || soc_type == QCA_WCN6750) {
+ if (soc_type == QCA_WCN3991 || soc_type == QCA_WCN6750 || soc_type == QCA_WCN6855) {
/* 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 61e9a50e66ae..b884095bcd9d 100644
--- a/drivers/bluetooth/btqca.h
+++ b/drivers/bluetooth/btqca.h
@@ -147,6 +147,7 @@ enum qca_btsoc_type {
QCA_WCN3991,
QCA_QCA6390,
QCA_WCN6750,
+ QCA_WCN6855,
};

#if IS_ENABLED(CONFIG_BT_QCA)
@@ -168,6 +169,10 @@ static inline bool qca_is_wcn6750(enum qca_btsoc_type soc_type)
{
return soc_type == QCA_WCN6750;
}
+static inline bool qca_is_wcn6855(enum qca_btsoc_type soc_type)
+{
+ return soc_type == QCA_WCN6855;
+}

#else

@@ -206,6 +211,11 @@ static inline bool qca_is_wcn6750(enum qca_btsoc_type soc_type)
return false;
}

+static inline bool qca_is_wcn6855(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 a5c19f32926b..18e2882772f9 100644
--- a/drivers/bluetooth/hci_qca.c
+++ b/drivers/bluetooth/hci_qca.c
@@ -606,7 +606,8 @@ static int qca_open(struct hci_uart *hu)
qcadev = serdev_device_get_drvdata(hu->serdev);

if (qca_is_wcn399x(qcadev->btsoc_type) ||
- qca_is_wcn6750(qcadev->btsoc_type))
+ qca_is_wcn6750(qcadev->btsoc_type) ||
+ qca_is_wcn6855(qcadev->btsoc_type))
hu->init_speed = qcadev->init_speed;

if (qcadev->oper_speed)
@@ -1317,7 +1318,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_wcn6750(qca_soc_type(hu)) ||
+ qca_is_wcn6855(qca_soc_type(hu)))
usleep_range(1000, 10000);
else
msleep(300);
@@ -1394,7 +1396,8 @@ static unsigned int qca_get_speed(struct hci_uart *hu,
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_wcn6750(qca_soc_type(hu)) ||
+ qca_is_wcn6855(qca_soc_type(hu))) {
if (!qca_get_speed(hu, QCA_INIT_SPEED) &&
!qca_get_speed(hu, QCA_OPER_SPEED))
return -EINVAL;
@@ -1428,7 +1431,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type)
* changing the baudrate of chip and host.
*/
if (qca_is_wcn399x(soc_type) ||
- qca_is_wcn6750(soc_type))
+ qca_is_wcn6750(soc_type) ||
+ qca_is_wcn6855(soc_type))
hci_uart_set_flow_control(hu, true);

if (soc_type == QCA_WCN3990) {
@@ -1446,7 +1450,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_wcn6750(soc_type) ||
+ qca_is_wcn6855(soc_type))
hci_uart_set_flow_control(hu, false);

if (soc_type == QCA_WCN3990) {
@@ -1681,7 +1686,8 @@ static int qca_power_on(struct hci_dev *hdev)
return 0;

if (qca_is_wcn399x(soc_type) ||
- qca_is_wcn6750(soc_type)) {
+ qca_is_wcn6750(soc_type) ||
+ qca_is_wcn6855(soc_type)) {
ret = qca_regulator_init(hu);
} else {
qcadev = serdev_device_get_drvdata(hu->serdev);
@@ -1722,7 +1728,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" : "ROME/QCA6390");
+ (soc_type == QCA_WCN6750) ? "wcn6750" :
+ (soc_type == QCA_WCN6855) ? "wcn6855" : "ROME/QCA6390");

qca->memdump_state = QCA_MEMDUMP_IDLE;

@@ -1734,7 +1741,8 @@ static int qca_setup(struct hci_uart *hu)
clear_bit(QCA_SSR_TRIGGERED, &qca->flags);

if (qca_is_wcn399x(soc_type) ||
- qca_is_wcn6750(soc_type)) {
+ qca_is_wcn6750(soc_type) ||
+ qca_is_wcn6855(soc_type)) {
set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks);
hci_set_aosp_capable(hdev);

@@ -1756,7 +1764,8 @@ static int qca_setup(struct hci_uart *hu)
}

if (!(qca_is_wcn399x(soc_type) ||
- qca_is_wcn6750(soc_type))) {
+ qca_is_wcn6750(soc_type) ||
+ qca_is_wcn6855(soc_type))) {
/* Get QCA version information */
ret = qca_read_soc_version(hdev, &ver, soc_type);
if (ret)
@@ -1882,6 +1891,23 @@ static const struct qca_device_data qca_soc_data_wcn6750 = {
.capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES,
};

+static const struct qca_device_data qca_soc_data_wcn6855 = {
+ .soc_type = QCA_WCN6855,
+ .vregs = (struct qca_vreg []) {
+ { "vddio", 5000 },
+ { "vddaon", 26000 },
+ { "vddbtcxmx", 126000 },
+ { "vddrfacmn", 12500 },
+ { "vddrfa0p8", 102000 },
+ { "vddrfa1p7", 302000 },
+ { "vddrfa1p2", 257000 },
+ { "vddrfa2p2", 1700000 },
+ { "vddasd", 200 },
+ },
+ .num_vregs = 9,
+ .capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES,
+};
+
static void qca_power_shutdown(struct hci_uart *hu)
{
struct qca_serdev *qcadev;
@@ -2046,7 +2072,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_wcn6750(data->soc_type) ||
+ qca_is_wcn6855(data->soc_type))) {
qcadev->btsoc_type = data->soc_type;
qcadev->bt_power = devm_kzalloc(&serdev->dev,
sizeof(struct qca_power),
@@ -2066,14 +2093,18 @@ static int qca_serdev_probe(struct serdev_device *serdev)

qcadev->bt_en = devm_gpiod_get_optional(&serdev->dev, "enable",
GPIOD_OUT_LOW);
- if (IS_ERR_OR_NULL(qcadev->bt_en) && data->soc_type == QCA_WCN6750) {
+ if (IS_ERR_OR_NULL(qcadev->bt_en)
+ && (data->soc_type == QCA_WCN6750 ||
+ data->soc_type == QCA_WCN6855)) {
dev_err(&serdev->dev, "failed to acquire BT_EN gpio\n");
power_ctrl_enabled = false;
}

qcadev->sw_ctrl = devm_gpiod_get_optional(&serdev->dev, "swctrl",
GPIOD_IN);
- if (IS_ERR_OR_NULL(qcadev->sw_ctrl) && data->soc_type == QCA_WCN6750)
+ if (IS_ERR_OR_NULL(qcadev->sw_ctrl)
+ && (data->soc_type == QCA_WCN6750 ||
+ data->soc_type == QCA_WCN6855))
dev_warn(&serdev->dev, "failed to acquire SW_CTRL gpio\n");

qcadev->susclk = devm_clk_get_optional(&serdev->dev, NULL);
@@ -2149,7 +2180,8 @@ static void qca_serdev_remove(struct serdev_device *serdev)
struct qca_power *power = qcadev->bt_power;

if ((qca_is_wcn399x(qcadev->btsoc_type) ||
- qca_is_wcn6750(qcadev->btsoc_type)) &&
+ qca_is_wcn6750(qcadev->btsoc_type) ||
+ qca_is_wcn6855(qcadev->btsoc_type)) &&
power->vregs_on)
qca_power_shutdown(&qcadev->serdev_hu);
else if (qcadev->susclk)
@@ -2334,6 +2366,7 @@ static const struct of_device_id qca_bluetooth_of_match[] = {
{ .compatible = "qcom,wcn3991-bt", .data = &qca_soc_data_wcn3991},
{ .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},
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, qca_bluetooth_of_match);
--
2.39.0


2023-01-29 21:52:24

by Steev Klimaszewski

[permalink] [raw]
Subject: [PATCH 3/4] arm64: dts: qcom: sc8280xp: Enable BT

From: Bjorn Andersson <[email protected]>

Signed-off-by: Bjorn Andersson <[email protected]>
---
arch/arm64/boot/dts/qcom/sc8280xp.dtsi | 14 ++++++++++++++
1 file changed, 14 insertions(+)

diff --git a/arch/arm64/boot/dts/qcom/sc8280xp.dtsi b/arch/arm64/boot/dts/qcom/sc8280xp.dtsi
index 122afa03bb40..2d98687fb1ea 100644
--- a/arch/arm64/boot/dts/qcom/sc8280xp.dtsi
+++ b/arch/arm64/boot/dts/qcom/sc8280xp.dtsi
@@ -1244,6 +1244,20 @@ spi3: spi@98c000 {
status = "disabled";
};

+ uart2: serial@988000 {
+ compatible = "qcom,geni-uart";
+ reg = <0 0x00988000 0 0x4000>;
+ clocks = <&gcc GCC_QUPV3_WRAP0_S2_CLK>;
+ clock-names = "se";
+ interrupts = <GIC_SPI 603 IRQ_TYPE_LEVEL_HIGH>;
+ operating-points-v2 = <&qup_opp_table_100mhz>;
+ power-domains = <&rpmhpd SC8280XP_CX>;
+ interconnects = <&clk_virt MASTER_QUP_CORE_0 0 &clk_virt SLAVE_QUP_CORE_0 0>,
+ <&gem_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_QUP_0 0>;
+ interconnect-names = "qup-core", "qup-config";
+ status = "disabled";
+ };
+
i2c4: i2c@990000 {
compatible = "qcom,geni-i2c";
reg = <0 0x00990000 0 0x4000>;
--
2.39.0


2023-01-29 21:52:42

by Steev Klimaszewski

[permalink] [raw]
Subject: [PATCH 4/4] arm64: dts: qcom: thinkpad-x13s: Add bluetooth

Signed-off-by: Steev Klimaszewski <[email protected]>
---
.../qcom/sc8280xp-lenovo-thinkpad-x13s.dts | 68 +++++++++++++++++++
1 file changed, 68 insertions(+)

diff --git a/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts b/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts
index e51f93476b8d..a9d653e02a2b 100644
--- a/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts
+++ b/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts
@@ -25,6 +25,8 @@ / {
aliases {
i2c4 = &i2c4;
i2c21 = &i2c21;
+ serial0 = &uart17;
+ serial1 = &uart2;
};

wcd938x: audio-codec {
@@ -886,6 +888,32 @@ &qup0 {
status = "okay";
};

+&uart2 {
+ status = "okay";
+
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart2_state>;
+
+ bluetooth {
+ compatible = "qcom,wcn6855-bt";
+
+/*
+ vddio-supply = <&vreg_s4a_1p8>;
+ vddxo-supply = <&vreg_l7a_1p8>;
+ vddrf-supply = <&vreg_l17a_1p3>;
+ vddch0-supply = <&vreg_l25a_3p3>;
+ vddch1-supply = <&vreg_l23a_3p3>;
+*/
+ max-speed = <3200000>;
+
+ enable-gpios = <&tlmm 133 GPIO_ACTIVE_HIGH>;
+ swctrl-gpios = <&tlmm 132 GPIO_ACTIVE_HIGH>;
+
+ pinctrl-names = "default";
+ pinctrl-0 = <&bt_en>;
+ };
+};
+
&qup1 {
status = "okay";
};
@@ -894,6 +922,12 @@ &qup2 {
status = "okay";
};

+&uart17 {
+ compatible = "qcom,geni-debug-uart";
+
+ status = "okay";
+};
+
&remoteproc_adsp {
firmware-name = "qcom/sc8280xp/LENOVO/21BX/qcadsp8280.mbn";

@@ -1154,6 +1188,19 @@ hastings_reg_en: hastings-reg-en-state {
&tlmm {
gpio-reserved-ranges = <70 2>, <74 6>, <83 4>, <125 2>, <128 2>, <154 7>;

+ bt_en: bt-en-state {
+ hstp-sw-ctrl {
+ pins = "gpio132";
+ function = "gpio";
+ };
+
+ hstp-bt-en {
+ pins = "gpio133";
+ function = "gpio";
+ drive-strength = <16>;
+ };
+ };
+
edp_reg_en: edp-reg-en-state {
pins = "gpio25";
function = "gpio";
@@ -1175,6 +1222,27 @@ i2c4_default: i2c4-default-state {
bias-disable;
};

+ uart2_state: uart2-state {
+ cts {
+ pins = "gpio122";
+ function = "qup2";
+ bias-disable;
+ };
+
+ rts-tx {
+ pins = "gpio122", "gpio123";
+ function = "qup2";
+ drive-strength = <2>;
+ bias-disable;
+ };
+
+ rx {
+ pins = "gpio124";
+ function = "qup2";
+ bias-pull-up;
+ };
+ };
+
i2c21_default: i2c21-default-state {
pins = "gpio81", "gpio82";
function = "qup21";
--
2.39.0


2023-01-30 06:43:34

by Paul Menzel

[permalink] [raw]
Subject: Re: [PATCH 0/4] Attempt at adding WCN6855 BT support

[Cc: +Mark Pearson]

Dear Steev,


Am 29.01.23 um 22:51 schrieb Steev Klimaszewski:
> This patchset is somewhat of an RFC/RFT, and also just something to get this out
> there.
>
> First things first, I do not have access to the specs nor the schematics, so a
> lot of this was done via guess work, looking at the acpi tables, and looking at
> how a similar device (wcn6750) was added.
>
> There are definitely checkpatch warnings, and I do apologize to those who won't
> review things until there are no warnings for wasting your time.
>
> One example is that I have the vregs commented out, the dt-bindings say that
> they are required since it's based on the wcn6750 work but also like the 6750,
> I've added defaults into the driver, and those seem to work, at least for the
> initial testing.
>
> The end result is that we do have a working device, but not entirely reliable.
>
> Hopefully by getting this out there, people who do have access to the specs or
> schematics can see where the improvements or fixes need to come.

Thank you for the patches. Reading until the end and seeing patch 4/4,
this is related to the Lenovo Thinkpad X13s. I am adding Mark Pearson to
the Cc list. No idea if GNU/Linux is officially supported by Lenovo, but
even if not, maybe Mark is able to get you access to the specifications
and schematics.


Kind regards,

Paul


> There are a few things that I am not sure why they happen, and don't have the
> knowledge level to figure out why they happen or debugging it.
>
> Bluetooth: hci0: setting up wcn6855
> Bluetooth: hci0: Frame reassembly failed (-84)
> Bluetooth: hci0: QCA Product ID :0x00000013
> Bluetooth: hci0: QCA SOC Version :0x400c0210
> Bluetooth: hci0: QCA ROM Version :0x00000201
> Bluetooth: hci0: QCA Patch Version:0x000038e6
> Bluetooth: hci0: QCA controller version 0x02100201
> Bluetooth: hci0: unexpected event for opcode 0xfc48
> Bluetooth: hci0: Sending QCA Patch config failed (-110)
> Bluetooth: hci0: QCA Downloading qca/hpbtfw21.tlv
> Bluetooth: hci0: QCA Downloading qca/hpnv21g.bin
> Bluetooth: hci0: QCA setup on UART is completed
>
> I do not know why the Frame assembly failed, nor the unexpected event.
>
> Likewise, I'm not entirely sure why it says the patch config send times out, and
> *then* seems to send it?
>
> The BD Address also seems to be incorrect, and I'm not sure what is going on
> there either.
>
> Additionally, I've tried with an additional patch that I'm not including that is
> based on commit 059924fdf6c1 ("Bluetooth: btqca: Use NVM files based on SoC ID
> for WCN3991") to try using the hpnv21g.bin or hpnv21.bin, and the firmware acted
> the same regardless, so I am assuming I don't truly need the "g" firmware on my
> Thinkpad X13s.
>
> Testing was done by connecting a Razer Orochi bluetooth mouse, and using it, as
> well as connecting to and using an H2GO bluetooth speaker and playing audio out
> via canberra-gtk-play as well as a couple of YouTube videos in a browser.
>
> The mouse only seems to work when < 2 ft. from the laptop, and for the speaker, only
> "A2DP Sink, codec SBC" would provide audio output, and while I could see that
> data was being sent to the speaker, it wasn't always outputting, and going >
> 4ft. away, would often disconnect.
>
> steev@wintermute:~$ hciconfig -a
> hci0: Type: Primary Bus: UART
> BD Address: 00:00:00:00:5A:AD ACL MTU: 1024:8 SCO MTU: 240:4
> UP RUNNING PSCAN
> RX bytes:1492 acl:0 sco:0 events:126 errors:0
> TX bytes:128743 acl:0 sco:0 commands:597 errors:0
> Features: 0xff 0xfe 0x8f 0xfe 0xd8 0x3f 0x5b 0x87
> Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
> Link policy: RSWITCH HOLD SNIFF
> Link mode: PERIPHERAL ACCEPT
> Name: 'wintermute'
> Class: 0x0c010c
> Service Classes: Rendering, Capturing
> Device Class: Computer, Laptop
> HCI Version: (0xc) Revision: 0x0
> LMP Version: (0xc) Subversion: 0x46f7
> Manufacturer: Qualcomm (29)
>
> steev@wintermute:~$ dmesg | grep Razer
> [ 3089.235440] input: Razer Orochi as /devices/virtual/misc/uhid/0005:1532:0056.0003/input/input11
> [ 3089.238580] hid-generic 0005:1532:0056.0003: input,hidraw2: BLUETOOTH HID v0.01 Mouse [Razer Orochi] on 00:00:00:00:5a:ad
> steev@wintermute:~$ dmesg | grep H2GO
> [ 3140.959947] input: H2GO Speaker (AVRCP) as /devices/virtual/input/input12
>
> Bjorn Andersson (1):
> arm64: dts: qcom: sc8280xp: Enable BT
>
> Steev Klimaszewski (3):
> dt-bindings: net: Add WCN6855 Bluetooth bindings
> Bluetooth: hci_qca: Add support for QTI Bluetooth chip wcn6855
> arm64: dts: qcom: thinkpad-x13s: Add bluetooth
>
> .../net/bluetooth/qualcomm-bluetooth.yaml | 2 +
> .../qcom/sc8280xp-lenovo-thinkpad-x13s.dts | 68 +++++++++++++++++++
> arch/arm64/boot/dts/qcom/sc8280xp.dtsi | 14 ++++
> drivers/bluetooth/btqca.c | 24 ++++++-
> drivers/bluetooth/btqca.h | 10 +++
> drivers/bluetooth/hci_qca.c | 59 ++++++++++++----
> 6 files changed, 162 insertions(+), 15 deletions(-)
>
>
> base-commit: e2f86c02fdc96ca29ced53221a3cbf50aa6f8b49

2023-01-30 06:53:31

by Paul Menzel

[permalink] [raw]
Subject: Re: [PATCH 0/4] Attempt at adding WCN6855 BT support

[Cc: Remove undeliverable [email protected]]

Am 29.01.23 um 22:51 schrieb Steev Klimaszewski:
> This patchset is somewhat of an RFC/RFT, and also just something to get this out
> there.
>
> First things first, I do not have access to the specs nor the schematics, so a
> lot of this was done via guess work, looking at the acpi tables, and looking at
> how a similar device (wcn6750) was added.
>
> There are definitely checkpatch warnings, and I do apologize to those who won't
> review things until there are no warnings for wasting your time.
>
> One example is that I have the vregs commented out, the dt-bindings say that
> they are required since it's based on the wcn6750 work but also like the 6750,
> I've added defaults into the driver, and those seem to work, at least for the
> initial testing.
>
> The end result is that we do have a working device, but not entirely reliable.
>
> Hopefully by getting this out there, people who do have access to the specs or
> schematics can see where the improvements or fixes need to come.
>
> There are a few things that I am not sure why they happen, and don't have the
> knowledge level to figure out why they happen or debugging it.
>
> Bluetooth: hci0: setting up wcn6855
> Bluetooth: hci0: Frame reassembly failed (-84)
> Bluetooth: hci0: QCA Product ID :0x00000013
> Bluetooth: hci0: QCA SOC Version :0x400c0210
> Bluetooth: hci0: QCA ROM Version :0x00000201
> Bluetooth: hci0: QCA Patch Version:0x000038e6
> Bluetooth: hci0: QCA controller version 0x02100201
> Bluetooth: hci0: unexpected event for opcode 0xfc48
> Bluetooth: hci0: Sending QCA Patch config failed (-110)
> Bluetooth: hci0: QCA Downloading qca/hpbtfw21.tlv
> Bluetooth: hci0: QCA Downloading qca/hpnv21g.bin
> Bluetooth: hci0: QCA setup on UART is completed
>
> I do not know why the Frame assembly failed, nor the unexpected event.
>
> Likewise, I'm not entirely sure why it says the patch config send times out, and
> *then* seems to send it?
>
> The BD Address also seems to be incorrect, and I'm not sure what is going on
> there either.
>
> Additionally, I've tried with an additional patch that I'm not including that is
> based on commit 059924fdf6c1 ("Bluetooth: btqca: Use NVM files based on SoC ID
> for WCN3991") to try using the hpnv21g.bin or hpnv21.bin, and the firmware acted
> the same regardless, so I am assuming I don't truly need the "g" firmware on my
> Thinkpad X13s.
>
> Testing was done by connecting a Razer Orochi bluetooth mouse, and using it, as
> well as connecting to and using an H2GO bluetooth speaker and playing audio out
> via canberra-gtk-play as well as a couple of YouTube videos in a browser.
>
> The mouse only seems to work when < 2 ft. from the laptop, and for the speaker, only
> "A2DP Sink, codec SBC" would provide audio output, and while I could see that
> data was being sent to the speaker, it wasn't always outputting, and going >
> 4ft. away, would often disconnect.
>
> steev@wintermute:~$ hciconfig -a
> hci0: Type: Primary Bus: UART
> BD Address: 00:00:00:00:5A:AD ACL MTU: 1024:8 SCO MTU: 240:4
> UP RUNNING PSCAN
> RX bytes:1492 acl:0 sco:0 events:126 errors:0
> TX bytes:128743 acl:0 sco:0 commands:597 errors:0
> Features: 0xff 0xfe 0x8f 0xfe 0xd8 0x3f 0x5b 0x87
> Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
> Link policy: RSWITCH HOLD SNIFF
> Link mode: PERIPHERAL ACCEPT
> Name: 'wintermute'
> Class: 0x0c010c
> Service Classes: Rendering, Capturing
> Device Class: Computer, Laptop
> HCI Version: (0xc) Revision: 0x0
> LMP Version: (0xc) Subversion: 0x46f7
> Manufacturer: Qualcomm (29)
>
> steev@wintermute:~$ dmesg | grep Razer
> [ 3089.235440] input: Razer Orochi as /devices/virtual/misc/uhid/0005:1532:0056.0003/input/input11
> [ 3089.238580] hid-generic 0005:1532:0056.0003: input,hidraw2: BLUETOOTH HID v0.01 Mouse [Razer Orochi] on 00:00:00:00:5a:ad
> steev@wintermute:~$ dmesg | grep H2GO
> [ 3140.959947] input: H2GO Speaker (AVRCP) as /devices/virtual/input/input12
>
> Bjorn Andersson (1):
> arm64: dts: qcom: sc8280xp: Enable BT
>
> Steev Klimaszewski (3):
> dt-bindings: net: Add WCN6855 Bluetooth bindings
> Bluetooth: hci_qca: Add support for QTI Bluetooth chip wcn6855
> arm64: dts: qcom: thinkpad-x13s: Add bluetooth
>
> .../net/bluetooth/qualcomm-bluetooth.yaml | 2 +
> .../qcom/sc8280xp-lenovo-thinkpad-x13s.dts | 68 +++++++++++++++++++
> arch/arm64/boot/dts/qcom/sc8280xp.dtsi | 14 ++++
> drivers/bluetooth/btqca.c | 24 ++++++-
> drivers/bluetooth/btqca.h | 10 +++
> drivers/bluetooth/hci_qca.c | 59 ++++++++++++----
> 6 files changed, 162 insertions(+), 15 deletions(-)
>
>
> base-commit: e2f86c02fdc96ca29ced53221a3cbf50aa6f8b49

2023-01-30 18:36:48

by Brian Masney

[permalink] [raw]
Subject: Re: [PATCH 3/4] arm64: dts: qcom: sc8280xp: Enable BT

On Sun, Jan 29, 2023 at 03:51:29PM -0600, Steev Klimaszewski wrote:
> From: Bjorn Andersson <[email protected]>
>
> Signed-off-by: Bjorn Andersson <[email protected]>

You should also add your Signed-off-by. Also the title of the patch
should be updated to say define uart2 instead of enable BT.

> ---
> arch/arm64/boot/dts/qcom/sc8280xp.dtsi | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/qcom/sc8280xp.dtsi b/arch/arm64/boot/dts/qcom/sc8280xp.dtsi
> index 122afa03bb40..2d98687fb1ea 100644
> --- a/arch/arm64/boot/dts/qcom/sc8280xp.dtsi
> +++ b/arch/arm64/boot/dts/qcom/sc8280xp.dtsi
> @@ -1244,6 +1244,20 @@ spi3: spi@98c000 {
> status = "disabled";
> };
>
> + uart2: serial@988000 {

This node needs to go after spi2 instead of spi3.

Everything else looks good to me.

Brian


2023-01-30 22:23:44

by Rob Herring (Arm)

[permalink] [raw]
Subject: Re: [PATCH 1/4] dt-bindings: net: Add WCN6855 Bluetooth bindings

On Sun, Jan 29, 2023 at 03:51:27PM -0600, Steev Klimaszewski wrote:
> Add bindings for the QTI WCN6855 chipset, based on the WCN6750.

Proper threading is all patches are reply to cover letter.

Drop the last 'binding' in the subject. Don't need it twice.

>
> Signed-off-by: Steev Klimaszewski <[email protected]>
> ---
> .../devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml b/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml
> index a6a6b0e4df7a..64e278561ba8 100644
> --- a/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml
> +++ b/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml
> @@ -23,6 +23,7 @@ properties:
> - qcom,wcn3998-bt
> - qcom,qca6390-bt
> - qcom,wcn6750-bt
> + - qcom,wcn6855-bt
>
> enable-gpios:
> maxItems: 1
> @@ -121,6 +122,7 @@ allOf:
> contains:
> enum:
> - qcom,wcn6750-bt
> + - qcom,wcn6855-bt
> then:
> required:
> - enable-gpios
> --
> 2.39.0
>

2023-01-31 02:22:13

by Steev Klimaszewski

[permalink] [raw]
Subject: Re: [PATCH 1/4] dt-bindings: net: Add WCN6855 Bluetooth bindings

Hi Rob,

On Mon, Jan 30, 2023 at 4:23 PM Rob Herring <[email protected]> wrote:
>
> Proper threading is all patches are reply to cover letter.
>
> Drop the last 'binding' in the subject. Don't need it twice.

Sorry, I'm not sure what happened with my threading here, I changed
chainreplyto=true to false in my .gitconfig so hopefully v2 will come
correctly.