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