audio: introduce dedicated adev->cal_lock for gef interfaces

Audio device lock is not suitable for GEF operations, so add a dedicated
calibration lock for GEF.

CRs-Fixed: 2413132
Change-Id: Ic1e840c02e9d7f1bce5d3cb12702366af1c07f01
diff --git a/hal/audio_extn/gef.c b/hal/audio_extn/gef.c
index 7f82a8a..cfed6b3 100644
--- a/hal/audio_extn/gef.c
+++ b/hal/audio_extn/gef.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -113,6 +113,7 @@
 
     ALOGV("%s: Enter with error", __func__);
 
+    pthread_mutex_init(&adev->cal_lock, (const pthread_mutexattr_t *) NULL);
     memset(&gef_hal_handle, 0, sizeof(gef_data));
 
     //: check error for dlopen
@@ -186,8 +187,8 @@
     ALOGV("%s: Enter", __func__);
     memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
 
-    //lock adev
-    pthread_mutex_lock(&adev->lock);
+    //lock adev->cal_lock
+    pthread_mutex_lock(&adev->cal_lock);
 
     //pack cal
     platform_make_cal_cfg(&cal, acdb_dev_id,
@@ -196,7 +197,7 @@
 
     ret = platform_send_audio_cal(adev->platform, &cal, data, length, persist);
 
-    pthread_mutex_unlock(&adev->lock);
+    pthread_mutex_unlock(&adev->cal_lock);
 
     ALOGV("%s: Exit with error %d", __func__, ret);
 
@@ -218,8 +219,8 @@
     ALOGV("%s: Enter", __func__);
     memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
 
-    //lock adev
-    pthread_mutex_lock(&adev->lock);
+    //lock adev->cal_lock
+    pthread_mutex_lock(&adev->cal_lock);
 
     //pack cal
     platform_make_cal_cfg(&cal, acdb_dev_id,
@@ -228,7 +229,7 @@
 
     ret = platform_get_audio_cal(adev->platform, &cal, data, length, persist);
 
-    pthread_mutex_unlock(&adev->lock);
+    pthread_mutex_unlock(&adev->cal_lock);
 
     ALOGV("%s: Exit with error %d", __func__, ret);
 
@@ -250,8 +251,8 @@
     ALOGV("%s: Enter", __func__);
     memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
 
-    //lock adev
-    pthread_mutex_lock(&adev->lock);
+    //lock adev->cal_lock
+    pthread_mutex_lock(&adev->cal_lock);
 
     //pack cal
     platform_make_cal_cfg(&cal, acdb_dev_id,
@@ -260,7 +261,7 @@
 
     ret = platform_store_audio_cal(adev->platform, &cal, data, length);
 
-    pthread_mutex_unlock(&adev->lock);
+    pthread_mutex_unlock(&adev->cal_lock);
 
     ALOGV("%s: Exit with error %d", __func__, ret);
 
@@ -281,8 +282,8 @@
     ALOGV("%s: Enter", __func__);
     memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
 
-    //lock adev
-    pthread_mutex_lock(&adev->lock);
+    //lock adev->cal_lock
+    pthread_mutex_lock(&adev->cal_lock);
 
     //pack cal
     platform_make_cal_cfg(&cal, acdb_dev_id,
@@ -291,7 +292,7 @@
 
     ret = platform_retrieve_audio_cal(adev->platform, &cal, data, length);
 
-    pthread_mutex_unlock(&adev->lock);
+    pthread_mutex_unlock(&adev->cal_lock);
 
     ALOGV("%s: Exit with error %d", __func__, ret);
 
@@ -313,8 +314,8 @@
     ALOGV("%s: Enter", __func__);
     memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
 
-    //lock adev
-    pthread_mutex_lock(&adev->lock);
+    //lock adev->cal_lock
+    pthread_mutex_lock(&adev->cal_lock);
 
     //pack cal
     platform_make_cal_cfg(&cal, acdb_dev_id,
@@ -323,7 +324,7 @@
 
     ret = platform_send_audio_cal(adev->platform, &cal, data, length, persist);
 
-    pthread_mutex_unlock(&adev->lock);
+    pthread_mutex_unlock(&adev->cal_lock);
 
     ALOGV("%s: Exit with error %d", __func__, ret);
 
@@ -345,8 +346,8 @@
     ALOGV("%s: Enter", __func__);
     memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
 
-    //lock adev
-    pthread_mutex_lock(&adev->lock);
+    //lock adev->cal_lock
+    pthread_mutex_lock(&adev->cal_lock);
 
     //pack cal
     platform_make_cal_cfg(&cal, acdb_dev_id,
@@ -355,7 +356,7 @@
 
     ret = platform_get_audio_cal(adev->platform, &cal, data, length, persist);
 
-    pthread_mutex_unlock(&adev->lock);
+    pthread_mutex_unlock(&adev->cal_lock);
 
     ALOGV("%s: Exit with error %d", __func__, ret);
 
@@ -376,8 +377,8 @@
     ALOGV("%s: Enter", __func__);
     memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
 
-    //lock adev
-    pthread_mutex_lock(&adev->lock);
+    //lock adev->cal_lock
+    pthread_mutex_lock(&adev->cal_lock);
 
     //pack cal
     platform_make_cal_cfg(&cal, acdb_dev_id,
@@ -386,7 +387,7 @@
 
     ret = platform_store_audio_cal(adev->platform, &cal, data, length);
 
-    pthread_mutex_unlock(&adev->lock);
+    pthread_mutex_unlock(&adev->cal_lock);
 
     ALOGV("%s: Exit with error %d", __func__, ret);
 
@@ -407,8 +408,8 @@
     ALOGV("%s: Enter", __func__);
     memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
 
-    //lock adev
-    pthread_mutex_lock(&adev->lock);
+    //lock adev->cal_lock
+    pthread_mutex_lock(&adev->cal_lock);
 
     //pack cal
     platform_make_cal_cfg(&cal, acdb_dev_id,
@@ -417,7 +418,7 @@
 
     ret = platform_retrieve_audio_cal(adev->platform, &cal, data, length);
 
-    pthread_mutex_unlock(&adev->lock);
+    pthread_mutex_unlock(&adev->cal_lock);
 
     ALOGV("%s: Exit with error %d", __func__, ret);
 
@@ -442,7 +443,7 @@
     return;
 }
 
-void audio_extn_gef_deinit()
+void audio_extn_gef_deinit(struct audio_device *adev)
 {
     ALOGV("%s: Enter", __func__);
 
@@ -452,6 +453,7 @@
         dlclose(gef_hal_handle.handle);
     }
 
+    pthread_mutex_destroy(&adev->cal_lock);
     memset(&gef_hal_handle, 0, sizeof(gef_data));
 
     ALOGV("%s: Exit", __func__);