Merge "sdm:fb: Add Mixer GC set functionality"
diff --git a/libqservice/IQService.h b/libqservice/IQService.h
index 16ea704..c877d06 100644
--- a/libqservice/IQService.h
+++ b/libqservice/IQService.h
@@ -59,7 +59,7 @@
         /* Enable/Disable/Set refresh rate dynamically */
         CONFIGURE_DYN_REFRESH_RATE = 18,
         SET_PARTIAL_UPDATE = 19,   // Preference on partial update feature
-        TOGGLE_SCREEN_UPDATE = 20, // Provides ability to disable screen updates
+        CONTROL_BACKLIGHT = 20, // Provides ability to control backlight
         SET_FRAME_DUMP_CONFIG = 21,  // Provides ability to set the frame dump config
         SET_S3D_MODE = 22, // Set the 3D mode as specified in msm_hdmi_modes.h
         CONNECT_HDMI_CLIENT = 23,  // Connect HDMI CEC HAL Client
diff --git a/libqservice/QServiceUtils.h b/libqservice/QServiceUtils.h
index 62ee0d1..b677188 100644
--- a/libqservice/QServiceUtils.h
+++ b/libqservice/QServiceUtils.h
@@ -74,8 +74,9 @@
     return sendSingleParam(qService::IQService::SCREEN_REFRESH, 1);
 }
 
+// TODO(user): Need to rename this wrapper name
 inline android::status_t toggleScreenUpdate(uint32_t on) {
-    return sendSingleParam(qService::IQService::TOGGLE_SCREEN_UPDATE, on);
+    return sendSingleParam(qService::IQService::CONTROL_BACKLIGHT, on);
 }
 
 inline android::status_t setPartialUpdate(uint32_t enable) {
diff --git a/sdm/libs/hwc/hwc_session.cpp b/sdm/libs/hwc/hwc_session.cpp
index 878ff4c..885a732 100644
--- a/sdm/libs/hwc/hwc_session.cpp
+++ b/sdm/libs/hwc/hwc_session.cpp
@@ -503,6 +503,10 @@
   case qService::IQService::SET_VIEW_FRAME:
     break;
 
+  case qService::IQService::CONTROL_BACKLIGHT:
+    status = ControlBackLight(input_parcel);
+    break;
+
   case qService::IQService::QDCM_SVC_CMDS:
     status = QdcmCMDHandler(*input_parcel, output_parcel);
     break;
@@ -515,6 +519,45 @@
   return status;
 }
 
+android::status_t HWCSession::ControlBackLight(const android::Parcel *input_parcel) {
+  uint32_t display_status = UINT32(input_parcel->readInt32());
+  HWCDisplay *display = hwc_display_[HWC_DISPLAY_PRIMARY];
+
+  DLOGI("Primary Display display_status = %d", display_status);
+
+  int fd = open("/sys/class/leds/lcd-backlight/brightness", O_RDWR);
+  const char *bl_brightness = "0";
+
+  if (fd < 0) {
+    DLOGE("unable to open brightness node err = %d errstr = %s", errno, strerror(errno));
+    return -1;
+  }
+
+  if (display_status == 0) {
+    // Read backlight and store it internally. Set backlight to 0 on primary.
+    if (read(fd, brightness_, sizeof(brightness_)) > 0) {
+      DLOGI("backlight brightness is %s", brightness_);
+      ssize_t ret = write(fd, bl_brightness, sizeof(bl_brightness));
+      if (ret < 0) {
+        DLOGE("Failed to write backlight node err = %d errstr = %s", errno, strerror(errno));
+        close(fd);
+        return -1;
+      }
+    }
+  } else {
+    // Restore backlight to original value.
+    ssize_t ret = write(fd, brightness_, sizeof(brightness_));
+    if (ret < 0) {
+      DLOGE("Failed to write backlight node err = %d errstr = %s", errno, strerror(errno));
+      close(fd);
+      return -1;
+    }
+  }
+  close(fd);
+
+  return display->SetDisplayStatus(display_status);
+}
+
 android::status_t HWCSession::SetSecondaryDisplayStatus(const android::Parcel *input_parcel) {
   uint32_t display_id = UINT32(input_parcel->readInt32());
   uint32_t display_status = UINT32(input_parcel->readInt32());
diff --git a/sdm/libs/hwc/hwc_session.h b/sdm/libs/hwc/hwc_session.h
index b3cbb70..c8550d5 100644
--- a/sdm/libs/hwc/hwc_session.h
+++ b/sdm/libs/hwc/hwc_session.h
@@ -87,6 +87,7 @@
   android::status_t SetMaxMixerStages(const android::Parcel *input_parcel);
   android::status_t SetDisplayMode(const android::Parcel *input_parcel);
   android::status_t SetSecondaryDisplayStatus(const android::Parcel *input_parcel);
+  android::status_t ControlBackLight(const android::Parcel *input_parcel);
   android::status_t ConfigureRefreshRate(const android::Parcel *input_parcel);
   android::status_t QdcmCMDHandler(const android::Parcel &in, android::Parcel *out);
 
@@ -100,8 +101,8 @@
   const char *uevent_thread_name_;
   HWCBufferAllocator *buffer_allocator_;
   HWCBufferSyncHandler *buffer_sync_handler_;
-
   HWCColorManager *color_mgr_;
+  char brightness_[64];
 };
 
 }  // namespace sdm