lights/sdm: Add support for new brightness node

Add support for the new brightness node under
/sys/class/backlight/panel0-backlight/brightness

Change-Id: I6489c6e3796b3f455b1aef3caae84da307e554e4
CRs-fixed: 1114808
diff --git a/liblight/lights.c b/liblight/lights.c
index d63cc67..3b5068c 100644
--- a/liblight/lights.c
+++ b/liblight/lights.c
@@ -61,6 +61,9 @@
 char const*const LCD_FILE
         = "/sys/class/leds/lcd-backlight/brightness";
 
+char const*const LCD_FILE2
+        = "/sys/class/backlight/panel0-backlight/brightness";
+
 char const*const BUTTON_FILE
         = "/sys/class/leds/button-backlight/brightness";
 
@@ -151,7 +154,11 @@
     g_last_backlight_mode = state->brightnessMode;
 
     if (!err) {
-        err = write_int(LCD_FILE, brightness);
+        if (!access(LCD_FILE, F_OK)) {
+            err = write_int(LCD_FILE, brightness);
+        } else {
+            err = write_int(LCD_FILE2, brightness);
+        }
     }
 
     pthread_mutex_unlock(&g_lock);
diff --git a/sdm/libs/core/drm/hw_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp
index 355dab9..4bbd0f6 100644
--- a/sdm/libs/core/drm/hw_device_drm.cpp
+++ b/sdm/libs/core/drm/hw_device_drm.cpp
@@ -284,15 +284,12 @@
 
 void HWDeviceDRM::GetHWPanelMaxBrightness() {
   char brightness[kMaxStringLength] = {0};
-  char kMaxBrightnessNode[64] = {0};
-
-  snprintf(kMaxBrightnessNode, sizeof(kMaxBrightnessNode), "%s",
-           "/sys/class/leds/lcd-backlight/max_brightness");
+  string kMaxBrightnessNode = "/sys/class/backlight/panel0-backlight/max_brightness";
 
   hw_panel_info_.panel_max_brightness = 255;
-  int fd = Sys::open_(kMaxBrightnessNode, O_RDONLY);
+  int fd = Sys::open_(kMaxBrightnessNode.c_str(), O_RDONLY);
   if (fd < 0) {
-    DLOGW("Failed to open max brightness node = %s, error = %s", kMaxBrightnessNode,
+    DLOGW("Failed to open max brightness node = %s, error = %s", kMaxBrightnessNode.c_str(),
           strerror(errno));
     return;
   }
@@ -646,7 +643,57 @@
 }
 
 DisplayError HWDeviceDRM::SetPanelBrightness(int level) {
-  return kErrorNotSupported;
+  DisplayError err = kErrorNone;
+  char buffer[kMaxSysfsCommandLength] = {0};
+
+  DLOGV_IF(kTagDriverConfig, "Set brightness level to %d", level);
+  int fd = Sys::open_(kBrightnessNode, O_RDWR);
+  if (fd < 0) {
+    DLOGV_IF(kTagDriverConfig, "Failed to open node = %s, error = %s ", kBrightnessNode,
+             strerror(errno));
+    return kErrorFileDescriptor;
+  }
+
+  int32_t bytes = snprintf(buffer, kMaxSysfsCommandLength, "%d\n", level);
+  ssize_t ret = Sys::pwrite_(fd, buffer, static_cast<size_t>(bytes), 0);
+  if (ret <= 0) {
+    DLOGV_IF(kTagDriverConfig, "Failed to write to node = %s, error = %s ", kBrightnessNode,
+             strerror(errno));
+    err = kErrorHardware;
+  }
+
+  Sys::close_(fd);
+
+  return err;
+}
+
+DisplayError HWDeviceDRM::GetPanelBrightness(int *level) {
+  DisplayError err = kErrorNone;
+  char brightness[kMaxStringLength] = {0};
+
+  if (!level) {
+    DLOGV_IF(kTagDriverConfig, "Invalid input, null pointer.");
+    return kErrorParameters;
+  }
+
+  int fd = Sys::open_(kBrightnessNode, O_RDWR);
+  if (fd < 0) {
+    DLOGV_IF(kTagDriverConfig, "Failed to open brightness node = %s, error = %s", kBrightnessNode,
+             strerror(errno));
+    return kErrorFileDescriptor;
+  }
+
+  if (Sys::pread_(fd, brightness, sizeof(brightness), 0) > 0) {
+    *level = atoi(brightness);
+    DLOGV_IF(kTagDriverConfig, "Brightness level = %d", *level);
+  } else {
+    DLOGV_IF(kTagDriverConfig, "Failed to read panel brightness");
+    err = kErrorHardware;
+  }
+
+  Sys::close_(fd);
+
+  return err;
 }
 
 DisplayError HWDeviceDRM::CachePanelBrightness(int level) {
@@ -669,10 +716,6 @@
   return kErrorNotSupported;
 }
 
-DisplayError HWDeviceDRM::GetPanelBrightness(int *level) {
-  return kErrorNotSupported;
-}
-
 DisplayError HWDeviceDRM::SetS3DMode(HWS3DMode s3d_mode) {
   return kErrorNotSupported;
 }
diff --git a/sdm/libs/core/drm/hw_device_drm.h b/sdm/libs/core/drm/hw_device_drm.h
index d6e64ad..31b8250 100644
--- a/sdm/libs/core/drm/hw_device_drm.h
+++ b/sdm/libs/core/drm/hw_device_drm.h
@@ -97,6 +97,7 @@
 
   static const int kMaxStringLength = 1024;
   static const int kNumPhysicalDisplays = 2;
+  static const int kMaxSysfsCommandLength = 12;
 
   DisplayError SetFormat(const LayerBufferFormat &source, uint32_t *target);
   DisplayError SetStride(HWDeviceType device_type, LayerBufferFormat format, uint32_t width,
@@ -131,6 +132,7 @@
   bool default_mode_ = false;
   sde_drm::DRMConnectorInfo connector_info_ = {};
   std::string interface_str_ = "DSI";
+  const char *kBrightnessNode = "/sys/class/backlight/panel0-backlight/brightness";
 };
 
 }  // namespace sdm