@@ -153,6 +153,7 @@ enum qca_btsoc_type {
QCA_WCN6750,
QCA_WCN6855,
QCA_WCN7850,
+ QCA_MAX,
};
#if IS_ENABLED(CONFIG_BT_QCA)
@@ -238,12 +238,17 @@ static void qca_dmp_hdr(struct hci_dev *hdev, struct sk_buff *skb);
static enum qca_btsoc_type qca_soc_type(struct hci_uart *hu)
{
+ /* For Non-serdev device, hu->proto_data records soc type
+ * set by ioctl HCIUARTSETPROTODATA.
+ */
+ int proto_data = (int)hu->proto_data;
enum qca_btsoc_type soc_type;
if (hu->serdev) {
struct qca_serdev *qsd = serdev_device_get_drvdata(hu->serdev);
-
soc_type = qsd->btsoc_type;
+ } else if ((proto_data > 0) && (proto_data < QCA_MAX)) {
+ soc_type = (enum qca_btsoc_type)proto_data;
} else {
soc_type = QCA_ROME;
}
@@ -2281,6 +2286,7 @@ static int qca_serdev_probe(struct serdev_device *serdev)
return -ENOMEM;
qcadev->serdev_hu.serdev = serdev;
+ qcadev->serdev_hu.proto_data = 0;
data = device_get_match_data(&serdev->dev);
serdev_device_set_drvdata(serdev, qcadev);
device_property_read_string(&serdev->dev, "firmware-name",
For non-serdev devices which are derived from tool btattach, only default soc type QCA_ROME is supported currently since there are no way to get soc type from DT or ACPI, this change supports more soc types by using user specified soc type for non-serdev devices. Signed-off-by: Zijun Hu <quic_zijuhu@quicinc.com> --- drivers/bluetooth/btqca.h | 1 + drivers/bluetooth/hci_qca.c | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-)