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[],
