hal: Update acdb extn and platform to pass Instance ID support info

Update acdb extn and platform to pass Instance ID support info
in order to enable ACDB loader use this info and call the respective
ACDB SW APIs. Update GEF APIs to support instance ID feature.
Add a property to query the instance ID support and use that
to call ACDB loader for instance ID support.

CRs-Fixed: 2199639
Change-Id: I64b41faf23cb42ec2af1695adb8a7021cad996dc
diff --git a/hal/acdb.c b/hal/acdb.c
index ad67d61..4cc674d 100644
--- a/hal/acdb.c
+++ b/hal/acdb.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
  * Not a Contribution.
  *
  * Copyright (C) 2013 The Android Open Source Project
@@ -28,6 +28,34 @@
 #include "acdb.h"
 #include "platform_api.h"
 
+#ifdef INSTANCE_ID_ENABLED
+int check_and_set_instance_id_support(struct mixer* mixer, bool acdb_support)
+{
+    const char *mixer_ctl_name = "Instance ID Support";
+    struct mixer_ctl* ctl;
+
+    ALOGV("%s", __func__);
+
+    /* Check for ACDB and property instance ID support and issue mixer control */
+    ctl = mixer_get_ctl_by_name(mixer, mixer_ctl_name);
+    if (!ctl) {
+        ALOGE("%s: Could not get ctl for mixer cmd - %s",
+                               __func__, mixer_ctl_name);
+        return -EINVAL;
+    }
+
+    ALOGD("%s: Final Instance ID support:%d\n", __func__, acdb_support);
+    if (mixer_ctl_set_value(ctl, 0, acdb_support) < 0) {
+        ALOGE("%s: Could not set Instance ID support %d", __func__,
+              acdb_support);
+        return -EINVAL;
+    }
+    return 0;
+}
+#else
+#define check_and_set_instance_id_support(x, y) -ENOSYS
+#endif
+
 int acdb_init(int snd_card_num)
 {
 
@@ -69,6 +97,11 @@
 
     ALOGV("%s: DLOPEN successful for %s", __func__, LIB_ACDB_LOADER);
 
+    my_data->acdb_init_v4 = (acdb_init_v4_t)dlsym(my_data->acdb_handle,
+                                                     "acdb_loader_init_v4");
+    if (my_data->acdb_init_v4 == NULL)
+        ALOGE("%s: dlsym error %s for acdb_loader_init_v4", __func__, dlerror());
+
     my_data->acdb_init_v3 = (acdb_init_v3_t)dlsym(my_data->acdb_handle,
                                                      "acdb_loader_init_v3");
     if (my_data->acdb_init_v3 == NULL)
@@ -82,7 +115,7 @@
     my_data->acdb_init = (acdb_init_t)dlsym(my_data->acdb_handle,
                                                  "acdb_loader_init_ACDB");
     if (my_data->acdb_init == NULL && my_data->acdb_init_v2 == NULL
-                                                 && my_data->acdb_init_v3 == NULL) {
+        && my_data->acdb_init_v3 == NULL && my_data->acdb_init_v4 == NULL) {
         ALOGE("%s: dlsym error %s for acdb_loader_init_ACDB", __func__, dlerror());
         goto cleanup;
     }
@@ -126,8 +159,16 @@
     int key = 0;
     struct listnode *node = NULL;
     struct meta_key_list *key_info = NULL;
+    static bool acdb_instance_id_support = false;
 
-    if (my_data->acdb_init_v3) {
+    my_data->acdb_init_data.cvd_version = cvd_version;
+    my_data->acdb_init_data.snd_card_name = strdup(snd_card_name);
+    my_data->acdb_init_data.meta_key_list = &my_data->acdb_meta_key_list;
+    my_data->acdb_init_data.is_instance_id_supported = &acdb_instance_id_support;
+
+    if (my_data->acdb_init_v4) {
+        result = my_data->acdb_init_v4(&my_data->acdb_init_data, ACDB_LOADER_INIT_V4);
+    } else if (my_data->acdb_init_v3) {
         result = my_data->acdb_init_v3(snd_card_name, cvd_version,
                                        &my_data->acdb_meta_key_list);
     } else if (my_data->acdb_init_v2) {
@@ -138,6 +179,9 @@
     } else {
         result = my_data->acdb_init();
     }
+    ALOGD("%s: ACDB Instance ID support after ACDB init:%d\n",
+          __func__, acdb_instance_id_support);
+    check_and_set_instance_id_support(mixer, acdb_instance_id_support);
 
 cleanup:
     if (NULL != my_data) {