power: perform_hint_action: return an error code

So far the caller never knows if setting the hint actually worked.
This leads to a potential disconnect between the actual setting and the
UI because set_power_profile simply assumes perform_hint_action worked.

Return an error code or 0, so the callers can check for success.

Change-Id: I180a367e9d8581a63dfa703046b37bc5cae8c6cb
Signed-off-by: Corinna Vinschen <xda@vinschen.de>
diff --git a/utils.c b/utils.c
index f9b2773..ffa3e34 100644
--- a/utils.c
+++ b/utils.c
@@ -279,49 +279,49 @@
         perf_lock_rel(lock_handle);
 }
 
-void perform_hint_action(int hint_id, int resource_values[], int num_resources)
+int perform_hint_action(int hint_id, int resource_values[], int num_resources)
 {
-    if (qcopt_handle) {
-        if (perf_lock_acq) {
-            /* Acquire an indefinite lock for the requested resources. */
-            int lock_handle = perf_lock_acq(0, 0, resource_values,
-                    num_resources);
+    if (qcopt_handle && perf_lock_acq) {
+        /* Acquire an indefinite lock for the requested resources. */
+        int lock_handle = perf_lock_acq(0, 0, resource_values,
+                num_resources);
 
-            if (lock_handle == -1) {
-                ALOGE("Failed to acquire lock.");
-            } else {
-                /* Add this handle to our internal hint-list. */
-                struct hint_data *new_hint =
-                    (struct hint_data *)malloc(sizeof(struct hint_data));
+        if (lock_handle == -1) {
+            ALOGE("Failed to acquire lock.");
+            return -EINVAL;
+        }
 
-                if (new_hint) {
-                    if (!active_hint_list_head.compare) {
-                        active_hint_list_head.compare =
-                            (int (*)(void *, void *))hint_compare;
-                        active_hint_list_head.dump = (void (*)(void *))hint_dump;
-                    }
+        /* Add this handle to our internal hint-list. */
+        struct hint_data *new_hint =
+            (struct hint_data *)malloc(sizeof(struct hint_data));
 
-                    new_hint->hint_id = hint_id;
-                    new_hint->perflock_handle = lock_handle;
+        if (!new_hint) {
+            /* Can't keep track of this lock. Release it. */
+            if (perf_lock_rel)
+                perf_lock_rel(lock_handle);
+            ALOGE("Failed to process hint.");
+            return -ENOMEM;
+        }
 
-                    if (add_list_node(&active_hint_list_head, new_hint) == NULL) {
-                        free(new_hint);
-                        /* Can't keep track of this lock. Release it. */
-                        if (perf_lock_rel)
-                            perf_lock_rel(lock_handle);
+        if (!active_hint_list_head.compare) {
+            active_hint_list_head.compare =
+                (int (*)(void *, void *))hint_compare;
+            active_hint_list_head.dump = (void (*)(void *))hint_dump;
+        }
 
-                        ALOGE("Failed to process hint.");
-                    }
-                } else {
-                    /* Can't keep track of this lock. Release it. */
-                    if (perf_lock_rel)
-                        perf_lock_rel(lock_handle);
+        new_hint->hint_id = hint_id;
+        new_hint->perflock_handle = lock_handle;
 
-                    ALOGE("Failed to process hint.");
-                }
-            }
+        if (add_list_node(&active_hint_list_head, new_hint) == NULL) {
+            free(new_hint);
+            /* Can't keep track of this lock. Release it. */
+            if (perf_lock_rel)
+                perf_lock_rel(lock_handle);
+            ALOGE("Failed to process hint.");
+            return -ENOMEM;
         }
     }
+    return 0;
 }
 
 void undo_hint_action(int hint_id)
diff --git a/utils.h b/utils.h
index 83f815e..79ebd33 100644
--- a/utils.h
+++ b/utils.h
@@ -36,8 +36,7 @@
 int is_interactive_governor(char*);
 int is_ondemand_governor(char*);
 
-void perform_hint_action(int hint_id, int resource_values[],
-    int num_resources);
+int perform_hint_action(int hint_id, int resource_values[], int num_resources);
 void undo_hint_action(int hint_id);
 void undo_initial_hint_action();
 void release_request(int lock_handle);