Merge "sdm: HWDevice: Set correct HWDisplayMode" into dev-1.0
diff --git a/sdm/libs/core/fb/hw_device.cpp b/sdm/libs/core/fb/hw_device.cpp
index 2da6f00..ea62325 100644
--- a/sdm/libs/core/fb/hw_device.cpp
+++ b/sdm/libs/core/fb/hw_device.cpp
@@ -617,8 +617,8 @@
     *mdp_flags |= MDP_LAYER_SOLID_FILL;
   }
 
-  if (hw_panel_info_.mode == kModeVideo && layer.flags.cursor && is_cursor_pipe_used) {
-    // Only video mode panels support ASYNC layer updates
+  if (hw_panel_info_.mode != kModeCommand && layer.flags.cursor && is_cursor_pipe_used) {
+    // command mode panels does not support async position update
     *mdp_flags |= MDP_LAYER_ASYNC;
   }
 }
@@ -674,7 +674,7 @@
     DLOGE("PanelInfo pointer in invalid.");
     return;
   }
-  char *string_buffer = new char[kMaxStringLength]();
+  char *string_buffer = reinterpret_cast<char*>(malloc(sizeof(char) * kMaxStringLength));
   if (!string_buffer) {
     DLOGE("Failed to allocated string_buffer memory");
     return;
@@ -684,14 +684,13 @@
   if (!fileptr) {
     DLOGW("Failed to open msm_fb_panel_info node device node %d", device_node);
   } else {
-    char *line = string_buffer;
     size_t len = kMaxStringLength;
 
-    while ((Sys::getline_(&line, &len, fileptr)) != -1) {
+    while ((Sys::getline_(&string_buffer, &len, fileptr)) != -1) {
       uint32_t token_count = 0;
       const uint32_t max_count = 10;
       char *tokens[max_count] = { NULL };
-      if (!ParseLine(line, "=\n", tokens, max_count, &token_count)) {
+      if (!ParseLine(string_buffer, "=\n", tokens, max_count, &token_count)) {
         if (!strncmp(tokens[0], "panel_name", strlen("panel_name"))) {
           snprintf(panel_info->panel_name, sizeof(panel_info->panel_name), "%s", tokens[1]);
           break;
@@ -700,7 +699,7 @@
     }
     Sys::fclose_(fileptr);
   }
-  delete[] string_buffer;
+  free(string_buffer);
 }
 
 void HWDevice::GetHWPanelInfoByNode(int device_node, HWPanelInfo *panel_info) {
@@ -754,81 +753,58 @@
     }
   }
   Sys::fclose_(fileptr);
-  panel_info->port = GetHWDisplayPort(device_node);
-  panel_info->mode = GetHWDisplayMode(device_node);
+  GetHWDisplayPortAndMode(device_node, &panel_info->port, &panel_info->mode);
   GetSplitInfo(device_node, panel_info);
   GetHWPanelNameByNode(device_node, panel_info);
 }
 
-HWDisplayPort HWDevice::GetHWDisplayPort(int device_node) {
-  char stringbuffer[kMaxStringLength];
-  HWDisplayPort port = kPortDefault;
+void HWDevice::GetHWDisplayPortAndMode(int device_node, HWDisplayPort *port, HWDisplayMode *mode) {
+  *port = kPortDefault;
+  *mode = kModeDefault;
+  char *stringbuffer = reinterpret_cast<char*>(malloc(sizeof(char) * kMaxStringLength));
+  if (!stringbuffer) {
+    DLOGE("Failed to allocated string_buffer memory");
+    return;
+  }
 
-  snprintf(stringbuffer, sizeof(stringbuffer), "%s%d/msm_fb_type", fb_path_, device_node);
+  snprintf(stringbuffer, kMaxStringLength, "%s%d/msm_fb_type", fb_path_, device_node);
   FILE *fileptr = Sys::fopen_(stringbuffer, "r");
   if (!fileptr) {
     DLOGW("File not found %s", stringbuffer);
-    return port;
+    free(stringbuffer);
+    return;
   }
 
-  char *line = stringbuffer;
   size_t len = kMaxStringLength;
-  ssize_t read;
-
-  read = Sys::getline_(&line, &len, fileptr);
+  ssize_t read = Sys::getline_(&stringbuffer, &len, fileptr);
   if (read == -1) {
     Sys::fclose_(fileptr);
-    return port;
+    free(stringbuffer);
+    return;
   }
-  if ((strncmp(line, "mipi dsi cmd panel", strlen("mipi dsi cmd panel")) == 0)) {
-    port = kPortDSI;
-  } else if ((strncmp(line, "mipi dsi video panel", strlen("mipi dsi video panel")) == 0)) {
-    port = kPortDSI;
-  } else if ((strncmp(line, "lvds panel", strlen("lvds panel")) == 0)) {
-    port = kPortLVDS;
-  } else if ((strncmp(line, "edp panel", strlen("edp panel")) == 0)) {
-    port = kPortEDP;
-  } else if ((strncmp(line, "dtv panel", strlen("dtv panel")) == 0)) {
-    port = kPortDTv;
-  } else if ((strncmp(line, "writeback panel", strlen("writeback panel")) == 0)) {
-    port = kPortWriteBack;
-  } else {
-    port = kPortDefault;
+  if ((strncmp(stringbuffer, "mipi dsi cmd panel", strlen("mipi dsi cmd panel")) == 0)) {
+    *port = kPortDSI;
+    *mode = kModeCommand;
+  } else if ((strncmp(stringbuffer, "mipi dsi video panel", strlen("mipi dsi video panel")) == 0)) {
+    *port = kPortDSI;
+    *mode = kModeVideo;
+  } else if ((strncmp(stringbuffer, "lvds panel", strlen("lvds panel")) == 0)) {
+    *port = kPortLVDS;
+    *mode = kModeVideo;
+  } else if ((strncmp(stringbuffer, "edp panel", strlen("edp panel")) == 0)) {
+    *port = kPortEDP;
+    *mode = kModeVideo;
+  } else if ((strncmp(stringbuffer, "dtv panel", strlen("dtv panel")) == 0)) {
+    *port = kPortDTv;
+    *mode = kModeVideo;
+  } else if ((strncmp(stringbuffer, "writeback panel", strlen("writeback panel")) == 0)) {
+    *port = kPortWriteBack;
+    *mode = kModeCommand;
   }
   Sys::fclose_(fileptr);
-  return port;
-}
+  free(stringbuffer);
 
-HWDisplayMode HWDevice::GetHWDisplayMode(int device_node) {
-  char stringbuffer[kMaxStringLength];
-  HWDisplayMode mode = kModeDefault;
-
-  snprintf(stringbuffer, sizeof(stringbuffer), "%s%d/msm_fb_type", fb_path_, device_node);
-  FILE *fileptr = Sys::fopen_(stringbuffer, "r");
-  if (!fileptr) {
-    DLOGW("File not found %s", stringbuffer);
-    return mode;
-  }
-
-  char *line = stringbuffer;
-  size_t len = kMaxStringLength;
-  ssize_t read;
-
-  read = Sys::getline_(&line, &len, fileptr);
-  if (read == -1) {
-    Sys::fclose_(fileptr);
-    return mode;
-  }
-  if ((strncmp(line, "mipi dsi cmd panel", strlen("mipi dsi cmd panel")) == 0)) {
-    mode = kModeCommand;
-  } else if ((strncmp(line, "mipi dsi video panel", strlen("mipi dsi video panel")) == 0)) {
-    mode = kModeVideo;
-  } else {
-    mode = kModeDefault;
-  }
-  Sys::fclose_(fileptr);
-
-  return mode;
+  return;
 }
 
 void HWDevice::GetSplitInfo(int device_node, HWPanelInfo *panel_info) {
diff --git a/sdm/libs/core/fb/hw_device.h b/sdm/libs/core/fb/hw_device.h
index 61c20ac..3f6737f 100644
--- a/sdm/libs/core/fb/hw_device.h
+++ b/sdm/libs/core/fb/hw_device.h
@@ -101,8 +101,7 @@
   void PopulateHWPanelInfo();
   void GetHWPanelInfoByNode(int device_node, HWPanelInfo *panel_info);
   void GetHWPanelNameByNode(int device_node, HWPanelInfo *panel_info);
-  HWDisplayPort GetHWDisplayPort(int device_node);
-  HWDisplayMode GetHWDisplayMode(int device_node);
+  void GetHWDisplayPortAndMode(int device_node, HWDisplayPort *port, HWDisplayMode *mode);
   void GetSplitInfo(int device_node, HWPanelInfo *panel_info);
   int ParseLine(char *input, char *tokens[], const uint32_t max_token, uint32_t *count);
   int ParseLine(char *input, const char *delim, char *tokens[],