2023-02-07 05:28:39

by Steev Klimaszewski

[permalink] [raw]
Subject: [PATCH v4 0/4] Add WCN6855 Bluetooth support

This is the 4th version of the patchset, which started out as a bit of an
RFC/RFT but has actually worked so, I think this 4th revision is in a pretty
decent spot, at least in terms of the code itself... that said...

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.

This 4th revision does have the regulators added, which were pulled from the
bsrc_bt.bin file from the Windows partition.

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.

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: Define uart2

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

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


base-commit: 4fafd96910add124586b549ad005dcd179de8a18
--
2.39.0



2023-02-07 05:28:42

by Steev Klimaszewski

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

Add bindings for the QTI WCN6855 chipset.

Signed-off-by: Steev Klimaszewski <[email protected]>
---

Changes since v3:
* Separate 6855 enum because we don't need 9 regulators like 6750
* Drop Ack because of changes

Changes since v2:
* No changes from v2

Changes since v1:
* drop second binding in subject line
---
.../net/bluetooth/qualcomm-bluetooth.yaml | 17 +++++++++++++++++
1 file changed, 17 insertions(+)

diff --git a/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml b/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml
index a6a6b0e4df7a..68f78b90d23a 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
@@ -133,6 +134,22 @@ allOf:
- vddrfa1p7-supply
- vddrfa1p2-supply
- vddasd-supply
+ - if:
+ properties:
+ compatible:
+ contains:
+ enum:
+ - qcom,wcn6855-bt
+ then:
+ required:
+ - enable-gpios
+ - swctrl-gpios
+ - vddio-supply
+ - vddbtcxmx-supply
+ - vddrfacmn-supply
+ - vddrfa0p8-supply
+ - vddrfa1p2-supply
+ - vddrfa1p7-supply

examples:
- |
--
2.39.0


2023-02-07 05:28:57

by Steev Klimaszewski

[permalink] [raw]
Subject: [PATCH v4 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.

Signed-off-by: Steev Klimaszewski <[email protected]>
---

Changes since v3:
* drop unused regulators

Changes since v2:
* drop unnecessary commit info

Changes since v1:
* None
---
drivers/bluetooth/btqca.c | 24 ++++++++++++++--
drivers/bluetooth/btqca.h | 10 +++++++
drivers/bluetooth/hci_qca.c | 56 ++++++++++++++++++++++++++++---------
3 files changed, 75 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 3df8c3606e93..a35612ba23b2 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) {
@@ -1682,7 +1687,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);
@@ -1723,7 +1729,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;

@@ -1735,7 +1742,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);

@@ -1757,7 +1765,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)
@@ -1883,6 +1892,20 @@ 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 },
+ { "vddbtcxmx", 126000 },
+ { "vddrfacmn", 12500 },
+ { "vddrfa0p8", 102000 },
+ { "vddrfa1p7", 302000 },
+ { "vddrfa1p2", 257000 },
+ },
+ .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;
@@ -2047,7 +2070,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),
@@ -2067,14 +2091,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);
@@ -2150,7 +2178,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)
@@ -2335,6 +2364,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-02-07 05:29:00

by Steev Klimaszewski

[permalink] [raw]
Subject: [PATCH v4 3/4] arm64: dts: qcom: sc8280xp: Define uart2

From: Bjorn Andersson <[email protected]>

Signed-off-by: Bjorn Andersson <[email protected]>
Signed-off-by: Steev Klimaszewski <[email protected]>
Reviewed-by: Brian Masney <[email protected]>

---

Changes since v3:
* Fix commit message changelog

Changes since v2:
* No changes since v2

Changes since v1:
* change subject line, move node, and add my s-o-b
---
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 fa2d0d7d1367..eab54aab3b76 100644
--- a/arch/arm64/boot/dts/qcom/sc8280xp.dtsi
+++ b/arch/arm64/boot/dts/qcom/sc8280xp.dtsi
@@ -1207,6 +1207,20 @@ spi2: spi@988000 {
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";
+ };
+
i2c3: i2c@98c000 {
compatible = "qcom,geni-i2c";
reg = <0 0x0098c000 0 0x4000>;
--
2.39.0


2023-02-07 05:29:04

by Steev Klimaszewski

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

The Lenovo Thinkpad X13s has a WCN6855 Bluetooth controller on uart2,
add this.

Signed-off-by: Steev Klimaszewski <[email protected]>
---

Changes since v3:
* Add vreg_s1c
* Add regulators and not dead code
* Fix commit message changelog

Changes since v2:
* Remove dead code and add TODO comment
* Make dtbs_check happy with the pin definitions
---
.../qcom/sc8280xp-lenovo-thinkpad-x13s.dts | 76 +++++++++++++++++++
1 file changed, 76 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 f936b020a71d..8e3c6524e7c6 100644
--- a/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts
+++ b/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts
@@ -24,6 +24,8 @@ / {
aliases {
i2c4 = &i2c4;
i2c21 = &i2c21;
+ serial0 = &uart17;
+ serial1 = &uart2;
};

wcd938x: audio-codec {
@@ -297,6 +299,14 @@ pmc8280c-rpmh-regulators {
qcom,pmic-id = "c";
vdd-bob-supply = <&vreg_vph_pwr>;

+ vreg_s1c: smps1 {
+ regulator-name = "vreg_s1c";
+ regulator-min-microvolt = <1880000>;
+ regulator-max-microvolt = <1900000>;
+ regulator-allowed-modes = <RPMH_REGULATOR_MODE_AUTO>;
+ regulator-allow-set-load;
+ };
+
vreg_l1c: ldo1 {
regulator-name = "vreg_l1c";
regulator-min-microvolt = <1800000>;
@@ -712,6 +722,32 @@ &qup0 {
status = "okay";
};

+&uart2 {
+ status = "okay";
+
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart2_state>;
+
+ bluetooth {
+ compatible = "qcom,wcn6855-bt";
+
+ vddio-supply = <&vreg_s10b>;
+ vddbtcxmx-supply = <&vreg_s12b>;
+ vddrfacmn-supply = <&vreg_s12b>;
+ vddrfa0p8-supply = <&vreg_s12b>;
+ vddrfa1p2-supply = <&vreg_s11b>;
+ vddrfa1p7-supply = <&vreg_s1c>;
+
+ 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";
};
@@ -720,6 +756,12 @@ &qup2 {
status = "okay";
};

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

@@ -980,6 +1022,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 {
+ pins = "gpio132";
+ function = "gpio";
+ };
+
+ hstp-bt-en-pins {
+ pins = "gpio133";
+ function = "gpio";
+ drive-strength = <16>;
+ };
+ };
+
edp_reg_en: edp-reg-en-state {
pins = "gpio25";
function = "gpio";
@@ -1001,6 +1056,27 @@ i2c4_default: i2c4-default-state {
bias-disable;
};

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


2023-02-07 05:52:28

by Luiz Augusto von Dentz

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

Hi Steev,

On Mon, Feb 6, 2023 at 9:28 PM Steev Klimaszewski <[email protected]> wrote:
>
> Added regulators,GPIOs and changes required to power on/off wcn6855.
> Added support for firmware download for wcn6855.
>
> Signed-off-by: Steev Klimaszewski <[email protected]>
> ---
>
> Changes since v3:
> * drop unused regulators
>
> Changes since v2:
> * drop unnecessary commit info
>
> Changes since v1:
> * None
> ---
> drivers/bluetooth/btqca.c | 24 ++++++++++++++--
> drivers/bluetooth/btqca.h | 10 +++++++
> drivers/bluetooth/hci_qca.c | 56 ++++++++++++++++++++++++++++---------
> 3 files changed, 75 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);

I suspect the above message is not really needed since you didn't even
request the firmware at this point.

> + 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 3df8c3606e93..a35612ba23b2 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;

This is really ugly I must say, why don't we just check if
qcadev->init_speed has been set then we set it as hu->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) {
> @@ -1682,7 +1687,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);
> @@ -1723,7 +1729,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;
>
> @@ -1735,7 +1742,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);
>
> @@ -1757,7 +1765,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)
> @@ -1883,6 +1892,20 @@ 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 },
> + { "vddbtcxmx", 126000 },
> + { "vddrfacmn", 12500 },
> + { "vddrfa0p8", 102000 },
> + { "vddrfa1p7", 302000 },
> + { "vddrfa1p2", 257000 },
> + },
> + .num_vregs = 6,
> + .capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES,

Since it appears there is already a struct like this for each soc type
we could perhaps just extend with the data needed instead of checking
the soc_type over and over again.

> +};
> +
> static void qca_power_shutdown(struct hci_uart *hu)
> {
> struct qca_serdev *qcadev;
> @@ -2047,7 +2070,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),
> @@ -2067,14 +2091,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);
> @@ -2150,7 +2178,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)
> @@ -2335,6 +2364,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
>


--
Luiz Augusto von Dentz

2023-02-07 08:05:31

by Krzysztof Kozlowski

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

On 07/02/2023 06:28, Steev Klimaszewski wrote:
> Add bindings for the QTI WCN6855 chipset.
>
> Signed-off-by: Steev Klimaszewski <[email protected]>
> ---
>


Reviewed-by: Krzysztof Kozlowski <[email protected]>

Best regards,
Krzysztof


2023-02-08 08:22:13

by Konrad Dybcio

[permalink] [raw]
Subject: Re: [PATCH v4 3/4] arm64: dts: qcom: sc8280xp: Define uart2



On 7.02.2023 06:28, Steev Klimaszewski wrote:
> From: Bjorn Andersson <[email protected]>
>
> Signed-off-by: Bjorn Andersson <[email protected]>
> Signed-off-by: Steev Klimaszewski <[email protected]>
> Reviewed-by: Brian Masney <[email protected]>
>
> ---
Reviewed-by: Konrad Dybcio <[email protected]>

Konrad
>
> Changes since v3:
> * Fix commit message changelog
>
> Changes since v2:
> * No changes since v2
>
> Changes since v1:
> * change subject line, move node, and add my s-o-b
> ---
> 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 fa2d0d7d1367..eab54aab3b76 100644
> --- a/arch/arm64/boot/dts/qcom/sc8280xp.dtsi
> +++ b/arch/arm64/boot/dts/qcom/sc8280xp.dtsi
> @@ -1207,6 +1207,20 @@ spi2: spi@988000 {
> 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";
> + };
> +
> i2c3: i2c@98c000 {
> compatible = "qcom,geni-i2c";
> reg = <0 0x0098c000 0 0x4000>;

2023-02-08 08:25:35

by Konrad Dybcio

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



On 7.02.2023 06:28, Steev Klimaszewski wrote:
> The Lenovo Thinkpad X13s has a WCN6855 Bluetooth controller on uart2,
> add this.
>
> Signed-off-by: Steev Klimaszewski <[email protected]>
> ---
>
> Changes since v3:
> * Add vreg_s1c
> * Add regulators and not dead code
> * Fix commit message changelog
>
> Changes since v2:
> * Remove dead code and add TODO comment
> * Make dtbs_check happy with the pin definitions
> ---
> .../qcom/sc8280xp-lenovo-thinkpad-x13s.dts | 76 +++++++++++++++++++
> 1 file changed, 76 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 f936b020a71d..8e3c6524e7c6 100644
> --- a/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts
> +++ b/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts
> @@ -24,6 +24,8 @@ / {
> aliases {
> i2c4 = &i2c4;
> i2c21 = &i2c21;
> + serial0 = &uart17;
> + serial1 = &uart2;
> };
>
> wcd938x: audio-codec {
> @@ -297,6 +299,14 @@ pmc8280c-rpmh-regulators {
> qcom,pmic-id = "c";
> vdd-bob-supply = <&vreg_vph_pwr>;
>
> + vreg_s1c: smps1 {
> + regulator-name = "vreg_s1c";
> + regulator-min-microvolt = <1880000>;
> + regulator-max-microvolt = <1900000>;
> + regulator-allowed-modes = <RPMH_REGULATOR_MODE_AUTO>;
Wouldn't you be interested in MODE_RET too?


> + regulator-allow-set-load;
> + };
> +
> vreg_l1c: ldo1 {
> regulator-name = "vreg_l1c";
> regulator-min-microvolt = <1800000>;
> @@ -712,6 +722,32 @@ &qup0 {
> status = "okay";
> };
>
> +&uart2 {
> + status = "okay";
> +
> + pinctrl-names = "default";
> + pinctrl-0 = <&uart2_state>;
pinctrl-0
pinctrl-names
status

> +
> + bluetooth {
> + compatible = "qcom,wcn6855-bt";
> +
> + vddio-supply = <&vreg_s10b>;
> + vddbtcxmx-supply = <&vreg_s12b>;
> + vddrfacmn-supply = <&vreg_s12b>;
> + vddrfa0p8-supply = <&vreg_s12b>;
> + vddrfa1p2-supply = <&vreg_s11b>;
> + vddrfa1p7-supply = <&vreg_s1c>;
> +
> + max-speed = <3200000>;
> +
> + enable-gpios = <&tlmm 133 GPIO_ACTIVE_HIGH>;
> + swctrl-gpios = <&tlmm 132 GPIO_ACTIVE_HIGH>;
> +
> + pinctrl-names = "default";
> + pinctrl-0 = <&bt_en>;
pinctrl-0
pinctrl-names

> + };
> +};
> +
> &qup1 {
> status = "okay";
> };
> @@ -720,6 +756,12 @@ &qup2 {
> status = "okay";
> };
>
> +&uart17 {
> + compatible = "qcom,geni-debug-uart";
> +
Not sure if this newline is necessary.


Konrad
> + status = "okay";
> +};
> +
> &remoteproc_adsp {
> firmware-name = "qcom/sc8280xp/LENOVO/21BX/qcadsp8280.mbn";
>
> @@ -980,6 +1022,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 {
> + pins = "gpio132";
> + function = "gpio";
> + };
> +
> + hstp-bt-en-pins {
> + pins = "gpio133";
> + function = "gpio";
> + drive-strength = <16>;
> + };
> + };
> +
> edp_reg_en: edp-reg-en-state {
> pins = "gpio25";
> function = "gpio";
> @@ -1001,6 +1056,27 @@ i2c4_default: i2c4-default-state {
> bias-disable;
> };
>
> + uart2_state: uart2-state {
> + cts-pins {
> + pins = "gpio122";
> + function = "qup2";
> + bias-disable;
> + };
> +
> + rts-tx-pins {
> + pins = "gpio122", "gpio123";
> + function = "qup2";
> + drive-strength = <2>;
> + bias-disable;
> + };
> +
> + rx-pins {
> + pins = "gpio124";
> + function = "qup2";
> + bias-pull-up;
> + };
> + };
> +
> i2c21_default: i2c21-default-state {
> pins = "gpio81", "gpio82";
> function = "qup21";

2023-02-13 08:28:37

by Tim Jiang

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

Hi Luiz and all:
I am QC bt host guys, today I sync up with qc btfw team and conclude following result:
1: as I mentioned before, qca2066 and wcn6855 are the same chip family, and they can share the same btfw patch, and distinguish by using different nvm based on board id.
2: I upload the btfw previously for qca2066 , you can refer to https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/commit/?id=2ba1beaae0c649ce8a50baecc8df9e81cd524e65 , and also wcn6855 can share to use btfw patch and nvm with qca2066.

3:steev patch does not include read board id part logical , I think it is better combine the steev patch and my patch into one.

Regards.
Tim


-----Original Message-----
From: Luiz Augusto von Dentz <[email protected]>
Sent: Friday, February 10, 2023 5:38 AM
To: Tim Jiang (QUIC) <[email protected]>
Cc: Steev Klimaszewski <[email protected]>
Subject: Re: [PATCH v4 2/4] Bluetooth: hci_qca: Add support for QTI Bluetooth chip wcn6855

Hi Tim,

On Thu, Feb 9, 2023 at 12:45 AM Tim Jiang (QUIC) <[email protected]> wrote:
>
> Hi steev:
>
> 6855 and 2066 are the same chip, the difference is 6855 use 2 ANT and 2066 use 3 ANT , but we have many nvm configs for 2066 and 6855 , that is the same , you can refer to I ever add support for 6855 usb .

Could you please review Steev changes, also if you could please refactor the code regarding the soc_type, making the necessary field as part of the data structure should make it a lot easier to add support for new configurations without having to change the code in multiple places.

> Regards.
> Tim
>
>


--
Luiz Augusto von Dentz