Merge "libhwc2.1: reset LHBM state while entering AOD mode" into tm-qpr-dev
diff --git a/libhwc2.1/libdevice/BrightnessController.cpp b/libhwc2.1/libdevice/BrightnessController.cpp
index 434e63e..1057629 100644
--- a/libhwc2.1/libdevice/BrightnessController.cpp
+++ b/libhwc2.1/libdevice/BrightnessController.cpp
@@ -382,9 +382,10 @@
 }
 
 void BrightnessController::onClearDisplay() {
+    resetLhbmState();
+
     std::lock_guard<std::recursive_mutex> lock(mBrightnessMutex);
     mEnhanceHbmReq.reset(false);
-    mLhbmReq.reset(false);
     mBrightnessFloatReq.reset(-1);
     mInstantHbmReq.reset(false);
 
@@ -397,9 +398,6 @@
     if (mBrightnessDimmingUsage == BrightnessDimmingUsage::NORMAL) {
         mDimming.store(true);
     }
-    mLhbm.reset(false);
-
-    mLhbmBrightnessAdj = false;
 
     std::lock_guard<std::recursive_mutex> lock1(mCabcModeMutex);
     mCabcMode.reset(false);
@@ -777,6 +775,13 @@
     return ret == NO_ERROR;
 }
 
+void BrightnessController::resetLhbmState() {
+    std::lock_guard<std::recursive_mutex> lock(mBrightnessMutex);
+    mLhbmReq.reset(false);
+    mLhbm.reset(false);
+    mLhbmBrightnessAdj = false;
+}
+
 void BrightnessController::setOutdoorVisibility(LbeState state) {
     std::lock_guard<std::recursive_mutex> lock(mCabcModeMutex);
     mOutdoorVisibility = (state != LbeState::OFF);
diff --git a/libhwc2.1/libdevice/BrightnessController.h b/libhwc2.1/libdevice/BrightnessController.h
index 97f6ea0..1a19758 100644
--- a/libhwc2.1/libdevice/BrightnessController.h
+++ b/libhwc2.1/libdevice/BrightnessController.h
@@ -116,6 +116,7 @@
     }
     int checkSysfsStatus(const char *file, const std::vector<std::string>& expectedValue,
                          const nsecs_t timeoutNs);
+    void resetLhbmState();
 
     uint32_t getBrightnessLevel() {
         std::lock_guard<std::recursive_mutex> lock(mBrightnessMutex);
diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
index 7d72633..594495b 100644
--- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
+++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
@@ -343,6 +343,11 @@
         mPowerModeState = mode;
     }
 
+    // LHBM will be disabled in the kernel while entering AOD mode if it's
+    // already enabled. Reset the state to avoid the sync problem.
+    mBrightnessController->resetLhbmState();
+    mLhbmOn = false;
+
     ExynosDisplay::updateRefreshRateHint();
 
     return HWC2_ERROR_NONE;