@@ -1317,7 +1317,8 @@ static int qca_set_baudrate(struct hci_dev *hdev, uint8_t baudrate)
1317
1317
1318
1318
/* Give the controller time to process the request */
1319
1319
if (qca_is_wcn399x (qca_soc_type (hu )) ||
1320
- qca_is_wcn6750 (qca_soc_type (hu )))
1320
+ qca_is_wcn6750 (qca_soc_type (hu )) ||
1321
+ qca_is_wcn6855 (qca_soc_type (hu )))
1321
1322
usleep_range (1000 , 10000 );
1322
1323
else
1323
1324
msleep (300 );
@@ -1394,7 +1395,8 @@ static unsigned int qca_get_speed(struct hci_uart *hu,
1394
1395
static int qca_check_speeds (struct hci_uart * hu )
1395
1396
{
1396
1397
if (qca_is_wcn399x (qca_soc_type (hu )) ||
1397
- qca_is_wcn6750 (qca_soc_type (hu ))) {
1398
+ qca_is_wcn6750 (qca_soc_type (hu )) ||
1399
+ qca_is_wcn6855 (qca_soc_type (hu ))) {
1398
1400
if (!qca_get_speed (hu , QCA_INIT_SPEED ) &&
1399
1401
!qca_get_speed (hu , QCA_OPER_SPEED ))
1400
1402
return - EINVAL ;
@@ -1428,7 +1430,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type)
1428
1430
* changing the baudrate of chip and host.
1429
1431
*/
1430
1432
if (qca_is_wcn399x (soc_type ) ||
1431
- qca_is_wcn6750 (soc_type ))
1433
+ qca_is_wcn6750 (soc_type ) ||
1434
+ qca_is_wcn6855 (soc_type ))
1432
1435
hci_uart_set_flow_control (hu , true);
1433
1436
1434
1437
if (soc_type == QCA_WCN3990 ) {
@@ -1446,7 +1449,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type)
1446
1449
1447
1450
error :
1448
1451
if (qca_is_wcn399x (soc_type ) ||
1449
- qca_is_wcn6750 (soc_type ))
1452
+ qca_is_wcn6750 (soc_type ) ||
1453
+ qca_is_wcn6855 (soc_type ))
1450
1454
hci_uart_set_flow_control (hu , false);
1451
1455
1452
1456
if (soc_type == QCA_WCN3990 ) {
@@ -1682,7 +1686,8 @@ static int qca_power_on(struct hci_dev *hdev)
1682
1686
return 0 ;
1683
1687
1684
1688
if (qca_is_wcn399x (soc_type ) ||
1685
- qca_is_wcn6750 (soc_type )) {
1689
+ qca_is_wcn6750 (soc_type ) ||
1690
+ qca_is_wcn6855 (soc_type )) {
1686
1691
ret = qca_regulator_init (hu );
1687
1692
} else {
1688
1693
qcadev = serdev_device_get_drvdata (hu -> serdev );
@@ -1723,7 +1728,8 @@ static int qca_setup(struct hci_uart *hu)
1723
1728
1724
1729
bt_dev_info (hdev , "setting up %s" ,
1725
1730
qca_is_wcn399x (soc_type ) ? "wcn399x" :
1726
- (soc_type == QCA_WCN6750 ) ? "wcn6750" : "ROME/QCA6390" );
1731
+ (soc_type == QCA_WCN6750 ) ? "wcn6750" :
1732
+ (soc_type == QCA_WCN6855 ) ? "wcn6855" : "ROME/QCA6390" );
1727
1733
1728
1734
qca -> memdump_state = QCA_MEMDUMP_IDLE ;
1729
1735
@@ -1735,7 +1741,8 @@ static int qca_setup(struct hci_uart *hu)
1735
1741
clear_bit (QCA_SSR_TRIGGERED , & qca -> flags );
1736
1742
1737
1743
if (qca_is_wcn399x (soc_type ) ||
1738
- qca_is_wcn6750 (soc_type )) {
1744
+ qca_is_wcn6750 (soc_type ) ||
1745
+ qca_is_wcn6855 (soc_type )) {
1739
1746
set_bit (HCI_QUIRK_USE_BDADDR_PROPERTY , & hdev -> quirks );
1740
1747
hci_set_aosp_capable (hdev );
1741
1748
@@ -1757,7 +1764,8 @@ static int qca_setup(struct hci_uart *hu)
1757
1764
}
1758
1765
1759
1766
if (!(qca_is_wcn399x (soc_type ) ||
1760
- qca_is_wcn6750 (soc_type ))) {
1767
+ qca_is_wcn6750 (soc_type ) ||
1768
+ qca_is_wcn6855 (soc_type ))) {
1761
1769
/* Get QCA version information */
1762
1770
ret = qca_read_soc_version (hdev , & ver , soc_type );
1763
1771
if (ret )
@@ -1883,6 +1891,20 @@ static const struct qca_device_data qca_soc_data_wcn6750 __maybe_unused = {
1883
1891
.capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES ,
1884
1892
};
1885
1893
1894
+ static const struct qca_device_data qca_soc_data_wcn6855 = {
1895
+ .soc_type = QCA_WCN6855 ,
1896
+ .vregs = (struct qca_vreg []) {
1897
+ { "vddio" , 5000 },
1898
+ { "vddbtcxmx" , 126000 },
1899
+ { "vddrfacmn" , 12500 },
1900
+ { "vddrfa0p8" , 102000 },
1901
+ { "vddrfa1p7" , 302000 },
1902
+ { "vddrfa1p2" , 257000 },
1903
+ },
1904
+ .num_vregs = 6 ,
1905
+ .capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES ,
1906
+ };
1907
+
1886
1908
static void qca_power_shutdown (struct hci_uart * hu )
1887
1909
{
1888
1910
struct qca_serdev * qcadev ;
@@ -1912,7 +1934,7 @@ static void qca_power_shutdown(struct hci_uart *hu)
1912
1934
host_set_baudrate (hu , 2400 );
1913
1935
qca_send_power_pulse (hu , false);
1914
1936
qca_regulator_disable (qcadev );
1915
- } else if (soc_type == QCA_WCN6750 ) {
1937
+ } else if (soc_type == QCA_WCN6750 || soc_type == QCA_WCN6855 ) {
1916
1938
gpiod_set_value_cansleep (qcadev -> bt_en , 0 );
1917
1939
msleep (100 );
1918
1940
qca_regulator_disable (qcadev );
@@ -2047,7 +2069,8 @@ static int qca_serdev_probe(struct serdev_device *serdev)
2047
2069
2048
2070
if (data &&
2049
2071
(qca_is_wcn399x (data -> soc_type ) ||
2050
- qca_is_wcn6750 (data -> soc_type ))) {
2072
+ qca_is_wcn6750 (data -> soc_type ) ||
2073
+ qca_is_wcn6855 (data -> soc_type ))) {
2051
2074
qcadev -> btsoc_type = data -> soc_type ;
2052
2075
qcadev -> bt_power = devm_kzalloc (& serdev -> dev ,
2053
2076
sizeof (struct qca_power ),
@@ -2067,14 +2090,18 @@ static int qca_serdev_probe(struct serdev_device *serdev)
2067
2090
2068
2091
qcadev -> bt_en = devm_gpiod_get_optional (& serdev -> dev , "enable" ,
2069
2092
GPIOD_OUT_LOW );
2070
- if (IS_ERR_OR_NULL (qcadev -> bt_en ) && data -> soc_type == QCA_WCN6750 ) {
2093
+ if (IS_ERR_OR_NULL (qcadev -> bt_en ) &&
2094
+ (data -> soc_type == QCA_WCN6750 ||
2095
+ data -> soc_type == QCA_WCN6855 )) {
2071
2096
dev_err (& serdev -> dev , "failed to acquire BT_EN gpio\n" );
2072
2097
power_ctrl_enabled = false;
2073
2098
}
2074
2099
2075
2100
qcadev -> sw_ctrl = devm_gpiod_get_optional (& serdev -> dev , "swctrl" ,
2076
2101
GPIOD_IN );
2077
- if (IS_ERR_OR_NULL (qcadev -> sw_ctrl ) && data -> soc_type == QCA_WCN6750 )
2102
+ if (IS_ERR_OR_NULL (qcadev -> sw_ctrl ) &&
2103
+ (data -> soc_type == QCA_WCN6750 ||
2104
+ data -> soc_type == QCA_WCN6855 ))
2078
2105
dev_warn (& serdev -> dev , "failed to acquire SW_CTRL gpio\n" );
2079
2106
2080
2107
qcadev -> susclk = devm_clk_get_optional (& serdev -> dev , NULL );
@@ -2150,8 +2177,9 @@ static void qca_serdev_remove(struct serdev_device *serdev)
2150
2177
struct qca_power * power = qcadev -> bt_power ;
2151
2178
2152
2179
if ((qca_is_wcn399x (qcadev -> btsoc_type ) ||
2153
- qca_is_wcn6750 (qcadev -> btsoc_type )) &&
2154
- power -> vregs_on )
2180
+ qca_is_wcn6750 (qcadev -> btsoc_type ) ||
2181
+ qca_is_wcn6855 (qcadev -> btsoc_type )) &&
2182
+ power -> vregs_on )
2155
2183
qca_power_shutdown (& qcadev -> serdev_hu );
2156
2184
else if (qcadev -> susclk )
2157
2185
clk_disable_unprepare (qcadev -> susclk );
@@ -2335,6 +2363,7 @@ static const struct of_device_id qca_bluetooth_of_match[] = {
2335
2363
{ .compatible = "qcom,wcn3991-bt" , .data = & qca_soc_data_wcn3991 },
2336
2364
{ .compatible = "qcom,wcn3998-bt" , .data = & qca_soc_data_wcn3998 },
2337
2365
{ .compatible = "qcom,wcn6750-bt" , .data = & qca_soc_data_wcn6750 },
2366
+ { .compatible = "qcom,wcn6855-bt" , .data = & qca_soc_data_wcn6855 },
2338
2367
{ /* sentinel */ }
2339
2368
};
2340
2369
MODULE_DEVICE_TABLE (of , qca_bluetooth_of_match );
0 commit comments