From 8b021cfacef931eea3418aea3e081adaffa85574 Mon Sep 17 00:00:00 2001 From: Saurabh Shah Date: Tue, 14 Mar 2017 12:16:43 -0700 Subject: [PATCH] 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 --- liblight/lights.c | 9 +++- sdm/libs/core/drm/hw_device_drm.cpp | 65 ++++++++++++++++++++++++----- sdm/libs/core/drm/hw_device_drm.h | 2 + 3 files changed, 64 insertions(+), 12 deletions(-) diff --git a/liblight/lights.c b/liblight/lights.c index d63cc679..3b5068cf 100644 --- a/liblight/lights.c +++ b/liblight/lights.c @@ -61,6 +61,9 @@ char const*const BLUE_LED_FILE 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 @@ set_light_backlight(struct light_device_t* dev, 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 355dab9f..4bbd0f60 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::GetHWDisplayPortAndMode() { 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::SetRefreshRate(uint32_t refresh_rate) { } 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(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 @@ DisplayError HWDeviceDRM::OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level) 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 d6e64ad6..31b8250b 100644 --- a/sdm/libs/core/drm/hw_device_drm.h +++ b/sdm/libs/core/drm/hw_device_drm.h @@ -97,6 +97,7 @@ class HWDeviceDRM : public HWInterface { 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 @@ class HWDeviceDRM : public HWInterface { 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