Merge tag android-5.1.0_r1 into AOSP_5.1_MERGE

Change-Id: Ibf5539a33b14aba68b8117c31dc7f2148016e018
diff --git a/6515/libsensors_iio/Android.mk b/6515/libsensors_iio/Android.mk
index 94e03f1..7ae62cd 100755
--- a/6515/libsensors_iio/Android.mk
+++ b/6515/libsensors_iio/Android.mk
@@ -153,6 +153,7 @@
 LOCAL_SHARED_LIBRARIES += libdl
 LOCAL_SHARED_LIBRARIES += liblog
 LOCAL_SHARED_LIBRARIES += libmllite
+LOCAL_SHARED_LIBRARIES += libhardware_legacy
 include $(BUILD_SHARED_LIBRARY)
 
 include $(CLEAR_VARS)
diff --git a/6515/libsensors_iio/sensors_mpl.cpp b/6515/libsensors_iio/sensors_mpl.cpp
index 3e1ff52..df0a97f 100755
--- a/6515/libsensors_iio/sensors_mpl.cpp
+++ b/6515/libsensors_iio/sensors_mpl.cpp
@@ -16,6 +16,7 @@
 
 #define FUNC_LOG LOGV("%s", __PRETTY_FUNCTION__)
 
+#include <hardware_legacy/power.h>
 #include <hardware/sensors.h>
 #include <fcntl.h>
 #include <errno.h>
@@ -61,6 +62,8 @@
 struct simplehead *headp;
 static pthread_mutex_t flush_handles_mutex = PTHREAD_MUTEX_INITIALIZER;
 
+static const char *smdWakelockStr = "significant motion";
+
 static struct sensor_t sSensorList[LOCAL_SENSORS];
 static int sensors = (sizeof(sSensorList) / sizeof(sensor_t));
 
@@ -121,6 +124,10 @@
     struct pollfd mPollFds[numFds];
     SensorBase *mSensor;
     CompassSensor *mCompassSensor;
+
+    /* Significant Motion wakelock support */
+    bool mSMDWakelockHeld;
+
 };
 
 /******************************************************************************/
@@ -132,6 +139,9 @@
     mCompassSensor = new CompassSensor();
     MPLSensor *mplSensor = new MPLSensor(mCompassSensor);
 
+    /* No significant motion events pending yet */
+    mSMDWakelockHeld = false;
+
    /* For Vendor-defined Accel Calibration File Load
     * Use the Following Constructor and Pass Your Load Cal File Function
     * 
@@ -197,6 +207,11 @@
     int nbEvents = 0;
     int nb, polltime = -1;
 
+    if (mSMDWakelockHeld) {
+        mSMDWakelockHeld = false;
+        release_wake_lock(smdWakelockStr);
+    }
+
     struct handle_entry *handle_element;
     pthread_mutex_lock(&flush_handles_mutex);
     if (!SIMPLEQ_EMPTY(&pending_flush_items_head)) {
@@ -243,9 +258,18 @@
                     nb = ((MPLSensor*) mSensor)->
                                     readDmpSignificantMotionEvents(data, count);
                     mPollFds[i].revents = 0;
-                    count -= nb;
-                    nbEvents += nb;
-                    data += nb; 
+                    if (nb) {
+                        if (!mSMDWakelockHeld) {
+                            /* Hold wakelock until Sensor Services reads event */
+                            acquire_wake_lock(PARTIAL_WAKE_LOCK, smdWakelockStr);
+                            LOGI_IF(1, "HAL: grabbed %s wakelock", smdWakelockStr);
+                            mSMDWakelockHeld = true;
+                        }
+
+                        count -= nb;
+                        nbEvents += nb;
+                        data += nb;
+                    }
                 } else if (i == dmpPed) {
                     nb = ((MPLSensor*) mSensor)->readDmpPedometerEvents(
                             data, count, ID_P, 0);
@@ -299,14 +323,6 @@
                 data += nb;
             }
         }
-
-        if (mPollFds[numSensorDrivers].revents & POLLIN) {
-            char msg;
-            int result = read(mPollFds[numSensorDrivers].fd, &msg, 1);
-            LOGE_IF(result < 0, 
-                    "error reading from wake pipe (%s)", strerror(errno));
-            mPollFds[numSensorDrivers].revents = 0;
-        }
     }
     return nbEvents;
 }