Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Bluetooth: qca: add WCN3950 support

WCN3950 is another example of the WCN39xx BT/WiFI family of chips. It
requires different firmware files and has different current
requirements, so add it as a separate SoC type.

The firmware for these chips has been recently added to the
linux-firmware repository and will be a part of the upcoming release:
- qca/cmbtfw12.tlv
- qca/cmbtfw13.tlv
- qca/cmnv12.bin
- qca/cmnv13.bin
- qca/cmnv13s.bin
- qca/cmnv13t.bin

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

authored by

Dmitry Baryshkov and committed by
Luiz Augusto von Dentz
d5712c51 1cc41b50

+43
+14
drivers/bluetooth/btqca.c
··· 816 816 snprintf(config.fwname, sizeof(config.fwname), "qca/%s", rampatch_name); 817 817 } else { 818 818 switch (soc_type) { 819 + case QCA_WCN3950: 820 + snprintf(config.fwname, sizeof(config.fwname), 821 + "qca/cmbtfw%02x.tlv", rom_ver); 822 + break; 819 823 case QCA_WCN3990: 820 824 case QCA_WCN3991: 821 825 case QCA_WCN3998: ··· 885 881 } 886 882 } else { 887 883 switch (soc_type) { 884 + case QCA_WCN3950: 885 + if (le32_to_cpu(ver.soc_id) == QCA_WCN3950_SOC_ID_T) 886 + variant = "t"; 887 + else if (le32_to_cpu(ver.soc_id) == QCA_WCN3950_SOC_ID_S) 888 + variant = "u"; 889 + 890 + snprintf(config.fwname, sizeof(config.fwname), 891 + "qca/cmnv%02x%s.bin", rom_ver, variant); 892 + break; 888 893 case QCA_WCN3990: 889 894 case QCA_WCN3991: 890 895 case QCA_WCN3998: ··· 960 947 * VsMsftOpCode. 961 948 */ 962 949 switch (soc_type) { 950 + case QCA_WCN3950: 963 951 case QCA_WCN3988: 964 952 case QCA_WCN3990: 965 953 case QCA_WCN3991:
+4
drivers/bluetooth/btqca.h
··· 41 41 42 42 #define QCA_WCN3991_SOC_ID 0x40014320 43 43 44 + #define QCA_WCN3950_SOC_ID_T 0x40074130 45 + #define QCA_WCN3950_SOC_ID_S 0x40075130 46 + 44 47 /* QCA chipset version can be decided by patch and SoC 45 48 * version, combination with upper 2 bytes from SoC 46 49 * and lower 2 bytes from patch will be used. ··· 148 145 QCA_INVALID = -1, 149 146 QCA_AR3002, 150 147 QCA_ROME, 148 + QCA_WCN3950, 151 149 QCA_WCN3988, 152 150 QCA_WCN3990, 153 151 QCA_WCN3998,
+25
drivers/bluetooth/hci_qca.c
··· 623 623 qcadev = serdev_device_get_drvdata(hu->serdev); 624 624 625 625 switch (qcadev->btsoc_type) { 626 + case QCA_WCN3950: 626 627 case QCA_WCN3988: 627 628 case QCA_WCN3990: 628 629 case QCA_WCN3991: ··· 1367 1366 1368 1367 /* Give the controller time to process the request */ 1369 1368 switch (qca_soc_type(hu)) { 1369 + case QCA_WCN3950: 1370 1370 case QCA_WCN3988: 1371 1371 case QCA_WCN3990: 1372 1372 case QCA_WCN3991: ··· 1454 1452 static int qca_check_speeds(struct hci_uart *hu) 1455 1453 { 1456 1454 switch (qca_soc_type(hu)) { 1455 + case QCA_WCN3950: 1457 1456 case QCA_WCN3988: 1458 1457 case QCA_WCN3990: 1459 1458 case QCA_WCN3991: ··· 1497 1494 * changing the baudrate of chip and host. 1498 1495 */ 1499 1496 switch (soc_type) { 1497 + case QCA_WCN3950: 1500 1498 case QCA_WCN3988: 1501 1499 case QCA_WCN3990: 1502 1500 case QCA_WCN3991: ··· 1532 1528 1533 1529 error: 1534 1530 switch (soc_type) { 1531 + case QCA_WCN3950: 1535 1532 case QCA_WCN3988: 1536 1533 case QCA_WCN3990: 1537 1534 case QCA_WCN3991: ··· 1751 1746 } 1752 1747 1753 1748 switch (soc_type) { 1749 + case QCA_WCN3950: 1754 1750 case QCA_WCN3988: 1755 1751 case QCA_WCN3990: 1756 1752 case QCA_WCN3991: ··· 1782 1776 qca_set_speed(hu, QCA_INIT_SPEED); 1783 1777 1784 1778 switch (soc_type) { 1779 + case QCA_WCN3950: 1785 1780 case QCA_WCN3988: 1786 1781 case QCA_WCN3990: 1787 1782 case QCA_WCN3991: ··· 1814 1807 return 0; 1815 1808 1816 1809 switch (soc_type) { 1810 + case QCA_WCN3950: 1817 1811 case QCA_WCN3988: 1818 1812 case QCA_WCN3990: 1819 1813 case QCA_WCN3991: ··· 1899 1891 soc_name = "qca2066"; 1900 1892 break; 1901 1893 1894 + case QCA_WCN3950: 1902 1895 case QCA_WCN3988: 1903 1896 case QCA_WCN3990: 1904 1897 case QCA_WCN3991: ··· 1934 1925 clear_bit(QCA_SSR_TRIGGERED, &qca->flags); 1935 1926 1936 1927 switch (soc_type) { 1928 + case QCA_WCN3950: 1937 1929 case QCA_WCN3988: 1938 1930 case QCA_WCN3990: 1939 1931 case QCA_WCN3991: ··· 1968 1958 } 1969 1959 1970 1960 switch (soc_type) { 1961 + case QCA_WCN3950: 1971 1962 case QCA_WCN3988: 1972 1963 case QCA_WCN3990: 1973 1964 case QCA_WCN3991: ··· 2055 2044 .recv = qca_recv, 2056 2045 .enqueue = qca_enqueue, 2057 2046 .dequeue = qca_dequeue, 2047 + }; 2048 + 2049 + static const struct qca_device_data qca_soc_data_wcn3950 __maybe_unused = { 2050 + .soc_type = QCA_WCN3950, 2051 + .vregs = (struct qca_vreg []) { 2052 + { "vddio", 15000 }, 2053 + { "vddxo", 60000 }, 2054 + { "vddrf", 155000 }, 2055 + { "vddch0", 585000 }, 2056 + }, 2057 + .num_vregs = 4, 2058 2058 }; 2059 2059 2060 2060 static const struct qca_device_data qca_soc_data_wcn3988 __maybe_unused = { ··· 2360 2338 qcadev->btsoc_type = QCA_ROME; 2361 2339 2362 2340 switch (qcadev->btsoc_type) { 2341 + case QCA_WCN3950: 2363 2342 case QCA_WCN3988: 2364 2343 case QCA_WCN3990: 2365 2344 case QCA_WCN3991: ··· 2398 2375 break; 2399 2376 } 2400 2377 fallthrough; 2378 + case QCA_WCN3950: 2401 2379 case QCA_WCN3988: 2402 2380 case QCA_WCN3990: 2403 2381 case QCA_WCN3991: ··· 2707 2683 { .compatible = "qcom,qca6174-bt" }, 2708 2684 { .compatible = "qcom,qca6390-bt", .data = &qca_soc_data_qca6390}, 2709 2685 { .compatible = "qcom,qca9377-bt" }, 2686 + { .compatible = "qcom,wcn3950-bt", .data = &qca_soc_data_wcn3950}, 2710 2687 { .compatible = "qcom,wcn3988-bt", .data = &qca_soc_data_wcn3988}, 2711 2688 { .compatible = "qcom,wcn3990-bt", .data = &qca_soc_data_wcn3990}, 2712 2689 { .compatible = "qcom,wcn3991-bt", .data = &qca_soc_data_wcn3991},