Bluetooth: mt7921s: Add .btmtk_get_codec_config_data
[linux-2.6-microblaze.git] / drivers / bluetooth / btmtksdio.c
index 4000a99..c28eb9f 100644 (file)
@@ -943,6 +943,55 @@ static int btmtksdio_get_data_path_id(struct hci_dev *hdev, __u8 *data_path_id)
        return 0;
 }
 
+static int btmtksdio_get_codec_config_data(struct hci_dev *hdev,
+                                          __u8 link, struct bt_codec *codec,
+                                          __u8 *ven_len, __u8 **ven_data)
+{
+       int err = 0;
+
+       if (!ven_data || !ven_len)
+               return -EINVAL;
+
+       *ven_len = 0;
+       *ven_data = NULL;
+
+       if (link != ESCO_LINK) {
+               bt_dev_err(hdev, "Invalid link type(%u)", link);
+               return -EINVAL;
+       }
+
+       *ven_data = kmalloc(sizeof(__u8), GFP_KERNEL);
+       if (!ven_data) {
+               err = -ENOMEM;
+               goto error;
+       }
+
+       /* supports only CVSD and mSBC offload codecs */
+       switch (codec->id) {
+       case 0x02:
+               **ven_data = 0x00;
+               break;
+       case 0x05:
+               **ven_data = 0x01;
+               break;
+       default:
+               err = -EINVAL;
+               bt_dev_err(hdev, "Invalid codec id(%u)", codec->id);
+               goto error;
+       }
+       /* codec and its capabilities are pre-defined to ids
+        * preset id = 0x00 represents CVSD codec with sampling rate 8K
+        * preset id = 0x01 represents mSBC codec with sampling rate 16K
+        */
+       *ven_len = sizeof(__u8);
+       return err;
+
+error:
+       kfree(*ven_data);
+       *ven_data = NULL;
+       return err;
+}
+
 static int btmtksdio_sco_setting(struct hci_dev *hdev)
 {
        const struct btmtk_sco sco_setting = {
@@ -980,6 +1029,7 @@ static int btmtksdio_sco_setting(struct hci_dev *hdev)
                return err;
 
        hdev->get_data_path_id = btmtksdio_get_data_path_id;
+       hdev->get_codec_config_data = btmtksdio_get_codec_config_data;
 
        return err;
 }