Merge "vendor: qcom: powerHal for sdm632"
diff --git a/power-8953.c b/power-8953.c
index 2781f6b..d0750e4 100644
--- a/power-8953.c
+++ b/power-8953.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016, 2018, 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
@@ -50,6 +50,8 @@
 #include "performance.h"
 #include "power-common.h"
 
+#define MIN_VAL(X,Y) ((X>Y)?(Y):(X))
+
 static int saved_interactive_mode = -1;
 static int display_hint_sent;
 static int video_encode_hint_sent;
@@ -63,6 +65,27 @@
 static int display_fd;
 #define SYS_DISPLAY_PWR "/sys/kernel/hbtp/display_pwr"
 
+static bool is_target_SDM632() /* Returns value=632 if target is SDM632 else value 0 */
+{
+    int fd;
+    bool is_target_SDM632 = false;
+    char buf[10] = {0};
+    fd = open("/sys/devices/soc0/soc_id", O_RDONLY);
+    if (fd >= 0) {
+        if (read(fd, buf, sizeof(buf) - 1) == -1) {
+            ALOGW("Unable to read soc_id");
+            is_target_SDM632 = false;
+        } else {
+            int soc_id = atoi(buf);
+            if (soc_id == 349 || soc_id == 350) {
+                is_target_SDM632 = true; /* Above SOCID for SDM632 */
+            }
+        }
+    }
+    close(fd);
+    return is_target_SDM632;
+}
+
 int  power_hint_override(struct power_module *module, power_hint_t hint,
         void *data)
 {
@@ -170,7 +193,9 @@
 /* Video Encode Hint */
 static void process_video_encode_hint(void *metadata)
 {
-    char governor[80];
+    char governor[80] = {0};
+    int resource_values[20] = {0};
+    int num_resources = 0;
     struct video_encode_metadata_t video_encode_metadata;
 
     ALOGI("Got process_video_encode_hint");
@@ -206,31 +231,85 @@
     }
 
     if (video_encode_metadata.state == 1) {
-        if ((strncmp(governor, INTERACTIVE_GOVERNOR,
+        if((strncmp(governor, SCHEDUTIL_GOVERNOR,
+            strlen(SCHEDUTIL_GOVERNOR)) == 0) &&
+            (strlen(governor) == strlen(SCHEDUTIL_GOVERNOR))) {
+            if(is_target_SDM632()) {
+                /* sample_ms = 10mS
+                * SLB for Core0 = -6
+                * SLB for Core1 = -6
+                * SLB for Core2 = -6
+                * SLB for Core3 = -6
+                * hispeed load = 95
+                * hispeed freq = 1036 */
+                int res[] = {0x41820000, 0xa,
+                             0x40c68100, 0xfffffffa,
+                             0x40c68110, 0xfffffffa,
+                             0x40c68120, 0xfffffffa,
+                             0x40c68130, 0xfffffffa,
+                             0x41440100, 0x5f,
+                             0x4143c100, 0x40c,
+                             };
+                memcpy(resource_values, res, MIN_VAL(sizeof(resource_values), sizeof(res)));
+                num_resources = sizeof(res)/sizeof(res[0]);
+                pthread_mutex_lock(&camera_hint_mutex);
+                camera_hint_ref_count++;
+                if (camera_hint_ref_count == 1) {
+                    if (!video_encode_hint_sent) {
+                        perform_hint_action(video_encode_metadata.hint_id,
+                        resource_values, num_resources);
+                        video_encode_hint_sent = 1;
+                    }
+                }
+                pthread_mutex_unlock(&camera_hint_mutex);
+            }
+            else {
+                /* sample_ms = 10mS */
+                int res[] = {0x41820000, 0xa,
+                            };
+                memcpy(resource_values, res, MIN_VAL(sizeof(resource_values), sizeof(res)));
+                num_resources = sizeof(res)/sizeof(res[0]);
+                pthread_mutex_lock(&camera_hint_mutex);
+                camera_hint_ref_count++;
+                if (camera_hint_ref_count == 1) {
+                    if (!video_encode_hint_sent) {
+                        perform_hint_action(video_encode_metadata.hint_id,
+                        resource_values, num_resources);
+                        video_encode_hint_sent = 1;
+                    }
+                }
+                pthread_mutex_unlock(&camera_hint_mutex);
+            }
+        }
+        else if ((strncmp(governor, INTERACTIVE_GOVERNOR,
             strlen(INTERACTIVE_GOVERNOR)) == 0) &&
             (strlen(governor) == strlen(INTERACTIVE_GOVERNOR))) {
             /* Sched_load and migration_notification disable
-             * timer rate - 40mS*/
-            int resource_values[] = {0x41430000, 0x1,
-                                     0x41434000, 0x1,
-                                     0x41424000, 0x28,
-                                     };
+            * timer rate - 40mS*/
+            int res[] = {0x41430000, 0x1,
+                         0x41434000, 0x1,
+                         0x41424000, 0x28,
+                         };
+            memcpy(resource_values, res, MIN_VAL(sizeof(resource_values), sizeof(res)));
+            num_resources = sizeof(res)/sizeof(res[0]);
             pthread_mutex_lock(&camera_hint_mutex);
             camera_hint_ref_count++;
             if (camera_hint_ref_count == 1) {
                 if (!video_encode_hint_sent) {
                     perform_hint_action(video_encode_metadata.hint_id,
-                    resource_values,
-                    sizeof(resource_values)/sizeof(resource_values[0]));
+                    resource_values, num_resources);
                     video_encode_hint_sent = 1;
                 }
            }
            pthread_mutex_unlock(&camera_hint_mutex);
         }
     } else if (video_encode_metadata.state == 0) {
-        if ((strncmp(governor, INTERACTIVE_GOVERNOR,
+        if (((strncmp(governor, INTERACTIVE_GOVERNOR,
             strlen(INTERACTIVE_GOVERNOR)) == 0) &&
-            (strlen(governor) == strlen(INTERACTIVE_GOVERNOR))) {
+            (strlen(governor) == strlen(INTERACTIVE_GOVERNOR))) ||
+            ((strncmp(governor, SCHEDUTIL_GOVERNOR,
+            strlen(SCHEDUTIL_GOVERNOR)) == 0) &&
+            (strlen(governor) == strlen(SCHEDUTIL_GOVERNOR)))) {
             pthread_mutex_lock(&camera_hint_mutex);
             camera_hint_ref_count--;
             if (!camera_hint_ref_count) {