Skip to content

Commit 7901d32

Browse files
authored
Bluetooth support for the RB1 platform (#817)
Import [patchset](https://lore.kernel.org/linux-arm-msm/[email protected]/) adding support for Bluetooth on RB1 platform. Support is provided both through 6.12 and -dev kernel recipes.
2 parents 9ee65d0 + 9cd25d0 commit 7901d32

17 files changed

+1442
-0
lines changed
Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
From 30209aeff75fe18cf01a63332a7a7f472877d445 Mon Sep 17 00:00:00 2001
2+
From: Cheng Jiang <[email protected]>
3+
Date: Tue, 7 Jan 2025 17:26:50 +0800
4+
Subject: [PATCH] Bluetooth: qca: Expand firmware-name to load specific
5+
rampatch
6+
7+
The firmware-name property has been expanded to specify the names of NVM
8+
and rampatch firmware for certain chips, such as the QCA6698 Bluetooth
9+
chip. Although it shares the same IP core as the WCN6855, the QCA6698
10+
has different RF components and RAM sizes, necessitating new firmware
11+
files. This change allows for the configuration of NVM and rampatch in
12+
DT.
13+
14+
Possible configurations:
15+
firmware-name = QCA6698/hpnv21.bin, QCA6698/hpbtfw21.tlv;
16+
firmware-name = QCA6698/hpnv21, QCA6698/hpbtfw21.tlv;
17+
18+
Signed-off-by: Cheng Jiang <[email protected]>
19+
Signed-off-by: Luiz Augusto von Dentz <[email protected]>
20+
Upstream-Status: Backport [https://git.kernel.org/bluetooth/bluetooth-next/c/30209aeff75f]
21+
---
22+
drivers/bluetooth/btqca.c | 82 +++++++++++++++++++------------------
23+
drivers/bluetooth/btqca.h | 5 ++-
24+
drivers/bluetooth/hci_qca.c | 22 +++++++---
25+
3 files changed, 63 insertions(+), 46 deletions(-)
26+
27+
diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c
28+
index 5cb1fd1a0c7b..a6b53d1f23db 100644
29+
--- a/drivers/bluetooth/btqca.c
30+
+++ b/drivers/bluetooth/btqca.c
31+
@@ -782,7 +782,7 @@ static void qca_get_nvm_name_by_board(char *fwname, size_t max_size,
32+
33+
int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
34+
enum qca_btsoc_type soc_type, struct qca_btsoc_version ver,
35+
- const char *firmware_name)
36+
+ const char *firmware_name, const char *rampatch_name)
37+
{
38+
struct qca_fw_config config = {};
39+
int err;
40+
@@ -811,44 +811,48 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
41+
42+
/* Download rampatch file */
43+
config.type = TLV_TYPE_PATCH;
44+
- switch (soc_type) {
45+
- case QCA_WCN3990:
46+
- case QCA_WCN3991:
47+
- case QCA_WCN3998:
48+
- snprintf(config.fwname, sizeof(config.fwname),
49+
- "qca/crbtfw%02x.tlv", rom_ver);
50+
- break;
51+
- case QCA_WCN3988:
52+
- snprintf(config.fwname, sizeof(config.fwname),
53+
- "qca/apbtfw%02x.tlv", rom_ver);
54+
- break;
55+
- case QCA_QCA2066:
56+
- snprintf(config.fwname, sizeof(config.fwname),
57+
- "qca/hpbtfw%02x.tlv", rom_ver);
58+
- break;
59+
- case QCA_QCA6390:
60+
- snprintf(config.fwname, sizeof(config.fwname),
61+
- "qca/htbtfw%02x.tlv", rom_ver);
62+
- break;
63+
- case QCA_WCN6750:
64+
- /* Choose mbn file by default.If mbn file is not found
65+
- * then choose tlv file
66+
- */
67+
- config.type = ELF_TYPE_PATCH;
68+
- snprintf(config.fwname, sizeof(config.fwname),
69+
- "qca/msbtfw%02x.mbn", rom_ver);
70+
- break;
71+
- case QCA_WCN6855:
72+
- snprintf(config.fwname, sizeof(config.fwname),
73+
- "qca/hpbtfw%02x.tlv", rom_ver);
74+
- break;
75+
- case QCA_WCN7850:
76+
- snprintf(config.fwname, sizeof(config.fwname),
77+
- "qca/hmtbtfw%02x.tlv", rom_ver);
78+
- break;
79+
- default:
80+
- snprintf(config.fwname, sizeof(config.fwname),
81+
- "qca/rampatch_%08x.bin", soc_ver);
82+
+ if (rampatch_name) {
83+
+ snprintf(config.fwname, sizeof(config.fwname), "qca/%s", rampatch_name);
84+
+ } else {
85+
+ switch (soc_type) {
86+
+ case QCA_WCN3990:
87+
+ case QCA_WCN3991:
88+
+ case QCA_WCN3998:
89+
+ snprintf(config.fwname, sizeof(config.fwname),
90+
+ "qca/crbtfw%02x.tlv", rom_ver);
91+
+ break;
92+
+ case QCA_WCN3988:
93+
+ snprintf(config.fwname, sizeof(config.fwname),
94+
+ "qca/apbtfw%02x.tlv", rom_ver);
95+
+ break;
96+
+ case QCA_QCA2066:
97+
+ snprintf(config.fwname, sizeof(config.fwname),
98+
+ "qca/hpbtfw%02x.tlv", rom_ver);
99+
+ break;
100+
+ case QCA_QCA6390:
101+
+ snprintf(config.fwname, sizeof(config.fwname),
102+
+ "qca/htbtfw%02x.tlv", rom_ver);
103+
+ break;
104+
+ case QCA_WCN6750:
105+
+ /* Choose mbn file by default.If mbn file is not found
106+
+ * then choose tlv file
107+
+ */
108+
+ config.type = ELF_TYPE_PATCH;
109+
+ snprintf(config.fwname, sizeof(config.fwname),
110+
+ "qca/msbtfw%02x.mbn", rom_ver);
111+
+ break;
112+
+ case QCA_WCN6855:
113+
+ snprintf(config.fwname, sizeof(config.fwname),
114+
+ "qca/hpbtfw%02x.tlv", rom_ver);
115+
+ break;
116+
+ case QCA_WCN7850:
117+
+ snprintf(config.fwname, sizeof(config.fwname),
118+
+ "qca/hmtbtfw%02x.tlv", rom_ver);
119+
+ break;
120+
+ default:
121+
+ snprintf(config.fwname, sizeof(config.fwname),
122+
+ "qca/rampatch_%08x.bin", soc_ver);
123+
+ }
124+
}
125+
126+
err = qca_download_firmware(hdev, &config, soc_type, rom_ver);
127+
diff --git a/drivers/bluetooth/btqca.h b/drivers/bluetooth/btqca.h
128+
index bb5207d7a8c7..9d28c8800225 100644
129+
--- a/drivers/bluetooth/btqca.h
130+
+++ b/drivers/bluetooth/btqca.h
131+
@@ -161,7 +161,7 @@ enum qca_btsoc_type {
132+
int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr);
133+
int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
134+
enum qca_btsoc_type soc_type, struct qca_btsoc_version ver,
135+
- const char *firmware_name);
136+
+ const char *firmware_name, const char *rampatch_name);
137+
int qca_read_soc_version(struct hci_dev *hdev, struct qca_btsoc_version *ver,
138+
enum qca_btsoc_type);
139+
int qca_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr);
140+
@@ -176,7 +176,8 @@ static inline int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdad
141+
static inline int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
142+
enum qca_btsoc_type soc_type,
143+
struct qca_btsoc_version ver,
144+
- const char *firmware_name)
145+
+ const char *firmware_name,
146+
+ const char *rampatch_name)
147+
{
148+
return -EOPNOTSUPP;
149+
}
150+
diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
151+
index 37129e6cb0eb..5d75087cca99 100644
152+
--- a/drivers/bluetooth/hci_qca.c
153+
+++ b/drivers/bluetooth/hci_qca.c
154+
@@ -228,7 +228,7 @@ struct qca_serdev {
155+
u32 init_speed;
156+
u32 oper_speed;
157+
bool bdaddr_property_broken;
158+
- const char *firmware_name;
159+
+ const char *firmware_name[2];
160+
};
161+
162+
static int qca_regulator_enable(struct qca_serdev *qcadev);
163+
@@ -258,7 +258,18 @@ static const char *qca_get_firmware_name(struct hci_uart *hu)
164+
if (hu->serdev) {
165+
struct qca_serdev *qsd = serdev_device_get_drvdata(hu->serdev);
166+
167+
- return qsd->firmware_name;
168+
+ return qsd->firmware_name[0];
169+
+ } else {
170+
+ return NULL;
171+
+ }
172+
+}
173+
+
174+
+static const char *qca_get_rampatch_name(struct hci_uart *hu)
175+
+{
176+
+ if (hu->serdev) {
177+
+ struct qca_serdev *qsd = serdev_device_get_drvdata(hu->serdev);
178+
+
179+
+ return qsd->firmware_name[1];
180+
} else {
181+
return NULL;
182+
}
183+
@@ -1855,6 +1866,7 @@ static int qca_setup(struct hci_uart *hu)
184+
unsigned int retries = 0;
185+
enum qca_btsoc_type soc_type = qca_soc_type(hu);
186+
const char *firmware_name = qca_get_firmware_name(hu);
187+
+ const char *rampatch_name = qca_get_rampatch_name(hu);
188+
int ret;
189+
struct qca_btsoc_version ver;
190+
struct qca_serdev *qcadev;
191+
@@ -1963,7 +1975,7 @@ static int qca_setup(struct hci_uart *hu)
192+
193+
/* Setup patch / NVM configurations */
194+
ret = qca_uart_setup(hdev, qca_baudrate, soc_type, ver,
195+
- firmware_name);
196+
+ firmware_name, rampatch_name);
197+
if (!ret) {
198+
clear_bit(QCA_IBS_DISABLED, &qca->flags);
199+
qca_debugfs_init(hdev);
200+
@@ -2309,8 +2321,8 @@ static int qca_serdev_probe(struct serdev_device *serdev)
201+
qcadev->serdev_hu.serdev = serdev;
202+
data = device_get_match_data(&serdev->dev);
203+
serdev_device_set_drvdata(serdev, qcadev);
204+
- device_property_read_string(&serdev->dev, "firmware-name",
205+
- &qcadev->firmware_name);
206+
+ device_property_read_string_array(&serdev->dev, "firmware-name",
207+
+ qcadev->firmware_name, ARRAY_SIZE(qcadev->firmware_name));
208+
device_property_read_u32(&serdev->dev, "max-speed",
209+
&qcadev->oper_speed);
210+
if (!qcadev->oper_speed)
211+
--
212+
2.39.5
213+
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
From 87e51368071f342be6046304a17789b01fddc840 Mon Sep 17 00:00:00 2001
2+
From: Dmitry Baryshkov <[email protected]>
3+
Date: Tue, 1 Apr 2025 17:56:51 +0300
4+
Subject: [PATCH] Bluetooth: qca: fix NV variant for one of WCN3950 SoCs
5+
6+
The QCA_WCN3950_SOC_ID_S should be using qca/cmnv13s.bin, rather than
7+
qca/cmnv13u.bin file. Correct the variant suffix to be used for this SoC
8+
ID.
9+
10+
Fixes: 3b0e0839d9f2 ("Bluetooth: qca: add WCN3950 support")
11+
Reported-by: Wojciech Slenska <[email protected]>
12+
Closes: https://github.com/qualcomm-linux/meta-qcom/pull/817#discussion_r2022866431
13+
Signed-off-by: Dmitry Baryshkov <[email protected]>
14+
Upstream-Status: Backport [https://git.kernel.org/bluetooth/bluetooth-next/c/87d48ed16c9f]
15+
---
16+
drivers/bluetooth/btqca.c | 2 +-
17+
1 file changed, 1 insertion(+), 1 deletion(-)
18+
19+
diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c
20+
index 3d6778b95e00..edefb9dc76aa 100644
21+
--- a/drivers/bluetooth/btqca.c
22+
+++ b/drivers/bluetooth/btqca.c
23+
@@ -889,7 +889,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
24+
if (le32_to_cpu(ver.soc_id) == QCA_WCN3950_SOC_ID_T)
25+
variant = "t";
26+
else if (le32_to_cpu(ver.soc_id) == QCA_WCN3950_SOC_ID_S)
27+
- variant = "u";
28+
+ variant = "s";
29+
30+
snprintf(config.fwname, sizeof(config.fwname),
31+
"qca/cmnv%02x%s.bin", rom_ver, variant);
32+
--
33+
2.39.5
34+
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
From 394d7aab802ce9bf6406d22524ab14cad7ace83a Mon Sep 17 00:00:00 2001
2+
From: Dmitry Baryshkov <[email protected]>
3+
Date: Fri, 7 Feb 2025 22:41:15 +0200
4+
Subject: [PATCH] dt-bindings: net: bluetooth: qualcomm: document WCN3950
5+
6+
WCN3950 is another member of the WiFi/BT WCN39xx family of the chips. It
7+
requires different firmware, so document it as a new compat string.
8+
9+
Reviewed-by: Krzysztof Kozlowski <[email protected]>
10+
Signed-off-by: Dmitry Baryshkov <[email protected]>
11+
Upstream-Status: Backport [https://git.kernel.org/bluetooth/bluetooth-next/c/a3d5067f33d1]
12+
---
13+
.../devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml | 2 ++
14+
1 file changed, 2 insertions(+)
15+
16+
diff --git a/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml b/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml
17+
index a72152f7e29b..6353a336f382 100644
18+
--- a/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml
19+
+++ b/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml
20+
@@ -19,6 +19,7 @@ properties:
21+
- qcom,qca2066-bt
22+
- qcom,qca6174-bt
23+
- qcom,qca9377-bt
24+
+ - qcom,wcn3950-bt
25+
- qcom,wcn3988-bt
26+
- qcom,wcn3990-bt
27+
- qcom,wcn3991-bt
28+
@@ -138,6 +139,7 @@ allOf:
29+
compatible:
30+
contains:
31+
enum:
32+
+ - qcom,wcn3950-bt
33+
- qcom,wcn3988-bt
34+
- qcom,wcn3990-bt
35+
- qcom,wcn3991-bt
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
From a749b2a90c94494018b2f67cbd54aa3f2d27625c Mon Sep 17 00:00:00 2001
2+
From: Dmitry Baryshkov <[email protected]>
3+
Date: Fri, 7 Feb 2025 22:41:16 +0200
4+
Subject: [PATCH] Bluetooth: qca: simplify WCN399x NVM loading
5+
6+
The WCN399x code has two separate cases for loading the NVM data. In
7+
preparation to adding support for WCN3950, which also requires similar
8+
quirk, split the "variant" to be specified explicitly and merge two
9+
snprintfs into a single one.
10+
11+
Signed-off-by: Dmitry Baryshkov <[email protected]>
12+
Upstream-Status: Backport [https://git.kernel.org/bluetooth/bluetooth-next/c/28a5679ac56f]
13+
---
14+
drivers/bluetooth/btqca.c | 13 ++++++-------
15+
1 file changed, 6 insertions(+), 7 deletions(-)
16+
17+
diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c
18+
index cdf09d9a9ad2..7d6b02fe2040 100644
19+
--- a/drivers/bluetooth/btqca.c
20+
+++ b/drivers/bluetooth/btqca.c
21+
@@ -785,6 +785,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
22+
const char *firmware_name, const char *rampatch_name)
23+
{
24+
struct qca_fw_config config = {};
25+
+ const char *variant = "";
26+
int err;
27+
u8 rom_ver = 0;
28+
u32 soc_ver;
29+
@@ -883,13 +884,11 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
30+
case QCA_WCN3990:
31+
case QCA_WCN3991:
32+
case QCA_WCN3998:
33+
- if (le32_to_cpu(ver.soc_id) == QCA_WCN3991_SOC_ID) {
34+
- snprintf(config.fwname, sizeof(config.fwname),
35+
- "qca/crnv%02xu.bin", rom_ver);
36+
- } else {
37+
- snprintf(config.fwname, sizeof(config.fwname),
38+
- "qca/crnv%02x.bin", rom_ver);
39+
- }
40+
+ if (le32_to_cpu(ver.soc_id) == QCA_WCN3991_SOC_ID)
41+
+ variant = "u";
42+
+
43+
+ snprintf(config.fwname, sizeof(config.fwname),
44+
+ "qca/crnv%02x%s.bin", rom_ver, variant);
45+
break;
46+
case QCA_WCN3988:
47+
snprintf(config.fwname, sizeof(config.fwname),

0 commit comments

Comments
 (0)