Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 13 additions & 6 deletions drivers/bluetooth/hci_qca.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ enum qca_flags {
enum qca_capabilities {
QCA_CAP_WIDEBAND_SPEECH = BIT(0),
QCA_CAP_VALID_LE_STATES = BIT(1),
QCA_CAP_HFP_HW_OFFLOAD = BIT(2),
};

/* HCI_IBS transmit side sleep protocol states */
Expand Down Expand Up @@ -229,6 +230,7 @@ struct qca_serdev {
u32 init_speed;
u32 oper_speed;
bool bdaddr_property_broken;
bool support_hfp_hw_offload;
const char *firmware_name[2];
};

Expand Down Expand Up @@ -1912,7 +1914,7 @@ static int qca_setup(struct hci_uart *hu)
const char *rampatch_name = qca_get_rampatch_name(hu);
int ret;
struct qca_btsoc_version ver;
struct qca_serdev *qcadev;
struct qca_serdev *qcadev = serdev_device_get_drvdata(hu->serdev);
const char *soc_name;

ret = qca_check_speeds(hu);
Expand Down Expand Up @@ -1976,7 +1978,6 @@ static int qca_setup(struct hci_uart *hu)
case QCA_WCN6750:
case QCA_WCN6855:
case QCA_WCN7850:
qcadev = serdev_device_get_drvdata(hu->serdev);
if (qcadev->bdaddr_property_broken)
hci_set_quirk(hdev, HCI_QUIRK_BDADDR_PROPERTY_BROKEN);

Expand Down Expand Up @@ -2066,7 +2067,7 @@ static int qca_setup(struct hci_uart *hu)
else
hu->hdev->set_bdaddr = qca_set_bdaddr;

if (soc_type == QCA_QCA2066)
if (qcadev->support_hfp_hw_offload)
qca_configure_hfp_offload(hdev);

qca->fw_version = le16_to_cpu(ver.patch_ver);
Expand Down Expand Up @@ -2150,7 +2151,8 @@ static const struct qca_device_data qca_soc_data_wcn3998 __maybe_unused = {
static const struct qca_device_data qca_soc_data_qca2066 __maybe_unused = {
.soc_type = QCA_QCA2066,
.num_vregs = 0,
.capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES,
.capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES |
QCA_CAP_HFP_HW_OFFLOAD,
};

static const struct qca_device_data qca_soc_data_qca6390 __maybe_unused = {
Expand Down Expand Up @@ -2186,7 +2188,8 @@ static const struct qca_device_data qca_soc_data_wcn6855 __maybe_unused = {
{ "vddrfa1p2", 257000 },
},
.num_vregs = 6,
.capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES,
.capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES |
QCA_CAP_HFP_HW_OFFLOAD,
};

static const struct qca_device_data qca_soc_data_wcn7850 __maybe_unused = {
Expand All @@ -2200,7 +2203,8 @@ static const struct qca_device_data qca_soc_data_wcn7850 __maybe_unused = {
{ "vddrfa1p9", 302000 },
},
.num_vregs = 6,
.capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES,
.capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES |
QCA_CAP_HFP_HW_OFFLOAD,
};

static void qca_power_shutdown(struct hci_uart *hu)
Expand Down Expand Up @@ -2535,6 +2539,9 @@ static int qca_serdev_probe(struct serdev_device *serdev)

if (!(data->capabilities & QCA_CAP_VALID_LE_STATES))
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_LE_STATES);

if (data->capabilities & QCA_CAP_HFP_HW_OFFLOAD)
qcadev->support_hfp_hw_offload = true;
}

return 0;
Expand Down